带数组的 C 结构的内存布局
Memory layout of C struct with arrays
假设我有一个 C 结构定义如下:
typedef struct
{
double array1[2];
} struct0_T;
内存是怎么布局的? struct 是只保存一个指针还是两个双打的值?之前我认为该结构包含一个指针,但今天我发现(令我惊讶的是)值存储在那里。不同的编译器之间是否有所不同?
该结构包含两个值。内存布局为 .array1[0]
,后跟 .array1[1]
,可选择地后跟一些填充量。
填充是唯一可以在编译器之间变化的部分(尽管在实践中,结构的唯一成员是数组,几乎肯定没有填充)。
虽然您可能听说过 C 中的数组是指针,但事实并非如此 - 数组是由所有成员对象组成的聚合类型,就像结构一样。只是在几乎所有表达式上下文中,数组的计算结果都是指向其第一个成员的指针。
上面的结构声明只是告诉编译器struct
数据结构类型的变量将占用sizeof(struct0_T)
字节的内存,一旦实例化该类型的变量,就会分配内存.
struct0_T s;
现在,s
包含两个 doubles
的数组。在这种情况下不会有填充。
假设我有一个 C 结构定义如下:
typedef struct
{
double array1[2];
} struct0_T;
内存是怎么布局的? struct 是只保存一个指针还是两个双打的值?之前我认为该结构包含一个指针,但今天我发现(令我惊讶的是)值存储在那里。不同的编译器之间是否有所不同?
该结构包含两个值。内存布局为 .array1[0]
,后跟 .array1[1]
,可选择地后跟一些填充量。
填充是唯一可以在编译器之间变化的部分(尽管在实践中,结构的唯一成员是数组,几乎肯定没有填充)。
虽然您可能听说过 C 中的数组是指针,但事实并非如此 - 数组是由所有成员对象组成的聚合类型,就像结构一样。只是在几乎所有表达式上下文中,数组的计算结果都是指向其第一个成员的指针。
上面的结构声明只是告诉编译器struct
数据结构类型的变量将占用sizeof(struct0_T)
字节的内存,一旦实例化该类型的变量,就会分配内存.
struct0_T s;
现在,s
包含两个 doubles
的数组。在这种情况下不会有填充。