Tag: memory alignment

Objective-C运行时:为class_addIvar添加大小和对齐的内容?

Objective-C Runtime提供了class_addIvar C函数 : BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types) 我对size和alignment什么alignment ? 我正在添加一个类型为UITextPosition *的实例变量,但是没有UITextPosition对象在范围内。 对于size ,我可以只做sizeof(self) ,其中self是UITextField的子类吗? 即,我可以假设UITextPosition对象与UITextField对象的大小相同吗? 如何alignment ?

结构对齐填充,最大填充大小和结构成员的顺序

我一直在学习结构数据填充,因为我发现我的sizeof()运算符没有返回我的预期。 根据我观察到的模式,它将结构成员与最大的数据类型对齐。 所以例如…… struct MyStruct1 { char a; // 1 byte char b; // 1 byte char c; // 1 byte char d; // 1 byte char e; // 1 byte // Total 5 Bytes //Total size of struct = 5 (no padding) }; struct MyStruct2 { char a; // 1 byte char b; // […]

为什么-Wcast-align没有警告在x86上从char *转换为int *?

我知道gcc有一个选项-Wcast-align,它会在指针被抛出时发出警告,以便增加目标所需的对齐。 这是我的计划: char data[10]; int ptr = *((int *)data); 在我的机器上,数据的对齐要求是1,而ptr是8。 为什么我没有收到警告? 可能是因为我正在为x86编译吗?

是否由于未定义的行为造成错位负载?

是否由于void*未定义的行为导致错位负载? 以下是我对Clang及其消毒剂的看法: bufhelp.h:146:29: runtime error: load of misaligned address 0x7fff04fdd0e1 for type ‘const uintptr_t’ (aka ‘const unsigned long’), which requires 8 byte alignment 0x7fff04fdd0e1: note: pointer points here 00 00 00 66 66 6f 6f 62 61 72 34 32 46 4f 4f 42 41 52 31 37 66 6f 6f 62 61 72 34 […]

何时复制填充字节 – 结构赋值,按值传递,其他?

在调试问题时,出现了以下问题。 (请忽略次要代码错误;代码仅供参考。) 定义了以下结构: typedef struct box_t { uint32_t x; uint16_t y; } box_t; 这个结构的实例正在通过函数的值传递(显然简化): void fun_a(box_t b) { … use b … } void fun_b(box_t bb) { // pass bb by value int err = funa(bb); } void fun_c(void) { box_t real_b; box_t some_b[10]; … … use real_b and some_b[] … … funb(real_b); funb(some_b[3]); … […]

对齐和未对齐的内存访问?

对齐和未对齐的内存访问有什么区别? 我在TMS320C64x DSP上工作,我想使用内部函数(汇编指令的C函数),它有 ushort & _amem2(void *ptr); ushort & _mem2(void *ptr); 其中_amem2执行2字节的对齐访问,而_mem2执行未对齐访问。 我什么时候应该使用哪个?

未对齐访问会导致ARM Cortex-M4出错

我有一个对象,其地址不是4字节对齐的。 当存在STR指令保存2个寄存器时,这会在cpu中导致HardFault错误。 这是生成的代码: 00000000 : 0: b510 push {r4, lr} 2: 4604 mov r4, r0 4: 6042 str r2, [r0, #4] 6: e9c4 3102 strd r3, r1, [r4, #8] a: 2001 movs r0, #1 c: 7420 strb r0, [r4, #16] e: b921 cbnz r1, 1a 这些是“4:6042 ……”行的寄存器 R0 08738B82 R8 0 R1 08738BAE R9 0 […]

是否有GCC关键字允许结构重新排序?

我知道为什么GCC默认不重新排序结构的成员,但我很少编写依赖于结构顺序的代码,所以有什么方法可以标记我的结构自动重新排序?

C未定义的行为。 严格别名规则或错误对齐?

我无法解释这个程序的执行行为: #include #include #include typedef char u8; typedef unsigned short u16; size_t f(u8 *keyc, size_t len) { u16 *key2 = (u16 *) (keyc + 1); size_t hash = len; len = len / 2; for (size_t i = 0; i < len; ++i) hash += key2[i]; return hash; } int main() { srand(time(NULL)); size_t len; […]