我有C#背景.我对C这样的低级语言非常陌生.
在C#中,struct
的内存默认由编译器布局.编译器可以重新排序数据字段或在字段之间隐式填充附加位.因此,我必须指定一些特殊属性来覆盖此行为以实现精确布局.
默认情况下,AFAIK、C不会重新排序或对齐struct
的内存布局.然而,我听说有一个很难找到的小例外.
C的内存布局行为是什么?哪些应该重新排序/对齐,哪些不应该?
我有C#背景.我对C这样的低级语言非常陌生.
在C#中,struct
的内存默认由编译器布局.编译器可以重新排序数据字段或在字段之间隐式填充附加位.因此,我必须指定一些特殊属性来覆盖此行为以实现精确布局.
默认情况下,AFAIK、C不会重新排序或对齐struct
的内存布局.然而,我听说有一个很难找到的小例外.
C的内存布局行为是什么?哪些应该重新排序/对齐,哪些不应该?
在C语言中,编译器可以 for each 基元类型指定一些对齐方式.通常,对齐方式是类型的大小.但它完全是特定于实现的.
引入了填充字节,因此每个对象都正确对齐.不允许重新排序.
可能每个远程现代编译器都实现#pragma pack
,其允许对填充的控制,并将其留给程序员来遵守ABI.(不过,这是严格意义上的非标准.)
根据C99第6.7.2.1节:
12每个非位字段成员
13分钟内