C中的结构内存布局我有一个C#背景。我非常喜欢像C这样的低级语言。在C#中,struct默认情况下由编译器布局内存。编译器可以隐式地重新排序数据字段或填充字段之间的附加位。因此,我必须指定一些特殊属性来覆盖此行为以获得精确布局。AFAIK,C struct默认情况下不重新排序或对齐a的内存布局。但是,我听说有一个很难找到的例外。什么是C的内存布局行为?什么应该重新订购/对齐而不是?
3 回答
慕哥6287543
TA贡献1831条经验 获得超10个赞
在C中,允许编译器为每种基本类型指定一些对齐。通常,对齐是类型的大小。但它完全是针对具体实施的。
引入填充字节,以便每个对象都正确对齐。不允许重新排序。
可能每个远程现代编译器都实现#pragma pack
了允许控制填充并将其留给程序员以符合ABI。(但它严格来说是非标准的。)
从C99§6.7.2.1:
12结构或联合对象的每个非位字段成员都以适合其类型的实现定义方式对齐。
13在结构对象中,非位字段成员和位域所在的单元具有按声明顺序增加的地址。指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。结构对象中可能存在未命名的填充,但不是在其开头。
- 3 回答
- 0 关注
- 521 浏览
添加回答
举报
0/150
提交
取消