我有C#背景.我对C这样的低级语言非常陌生.

在C#中,struct的内存默认由编译器布局.编译器可以重新排序数据字段或在字段之间隐式填充附加位.因此,我必须指定一些特殊属性来覆盖此行为以实现精确布局.

默认情况下,AFAIK、C不会重新排序或对齐struct的内存布局.然而,我听说有一个很难找到的小例外.

C的内存布局行为是什么?哪些应该重新排序/对齐,哪些不应该?

推荐答案

在C语言中,编译器可以 for each 基元类型指定一些对齐方式.通常,对齐方式是类型的大小.但它完全是特定于实现的.

引入了填充字节,因此每个对象都正确对齐.不允许重新排序.

可能每个远程现代编译器都实现#pragma pack,其允许对填充的控制,并将其留给程序员来遵守ABI.(不过,这是严格意义上的非标准.)

根据C99第6.7.2.1节:

12每个非位字段成员

13分钟内

C++相关问答推荐

从内联程序集调用Rust函数和调用约定

如何创建由符号组成的垂直结果图形?

使用NameSurname扫描到两个单独的字符串

如何使fputs功能提示错误输入并要求用户重新输入.程序停止而不是请求新的输入

如果我释放其他内容,返回值就会出错

在C++中头文件中声明外部 struct

二进制计算器与gmp

如何在C中使printf不刷新标准输出?

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

将 struct 传递给函数

1处的解析器错误:yacc语法的语法错误

每次除以或乘以整数都会得到0.0000

用gcc-msse 2编译的C程序包含AVX 1指令

如何按顺序将所有CSV文件数据读入 struct 数组?

从Raku nativecall调用时精度不同

malloc 属性不带参数

Makefile - 将 .o 文件放入子文件夹中

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?

int 与 size_t 与 long

如何在C中以0x格式打印十六进制值