3

假设sizeof(int)sizeof(double)分别为 4 和 8,并且在以下代码或编译器选项之前没有预处理器命令,如#pragma pack,与编译器命令行中使用的#pragma pack功能相同

typedef struct
{
    int n;
    double d;
} T;

那么sizeof(T)是多少?

我认为这取决于 CPU 和 RAM 之间的数据总线的宽度。如果宽度为 32 位,则 sizeof(T) 为 12。如果宽度为 64 位,则 sizeof(T) 为 16。在具有 32 位数据总线的计算机上,将 64 位数字从 CPU 传输到 RAM反之亦然,CPU 必须访问数据总线两次,一次读取或写入 32 位,因此将结构体T的成员d存储在8 的倍数的地址是没有意义的。

你同意吗?

(对不起我的英语不好)

4

1 回答 1

4

那么多少钱sizeof(T)

您是对的,这高度依赖于系统、编译器和优化设置。一般来说,编译器最清楚,至少在理论上,为double结构的 8 字节成员选择什么对齐方式。此外,当您要求编译器针对较小的内存占用进行优化时,与您要求它针对最快速度进行优化时,编译器的决定可能会有所不同。

最后,在某些系统中,从在四字节边界对齐但不在八字节边界对齐的地址读取八个字节可能根本不会带来任何损失。同样,您的编译器处于了解这一事实的最佳位置,并避免struct不必要地填充您的内容。

struct关于对齐,要记住的最重要的一点是,即使您不打算将产品移植到不同的平台,也不应该假设您的 .足以使您的假设无效。

于 2013-09-26T14:05:04.787 回答