gpt4 book ai didi

c - 是否没有必要在 8 的倍数地址处存储结构的 double 成员?

转载 作者:行者123 更新时间:2023-12-04 02:44:55 24 4
gpt4 key购买 nike

假设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 的倍数。

你同意吗?

(抱歉我的英语不好)

最佳答案

then how much is sizeof(T)?

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

最后,可能存在从以四字节边界而不是八字节边界对齐的地址读取八个字节的系统可能根本不会受到任何惩罚。同样,您的编译器最了解这一事实,并避免不必要地填充您的 struct

关于对齐最重要的一点是你不应该假设你的 struct 的特定布局,即使你不打算将你的产品移植到不同的平台,因为改变就像向 makefile 添加优化标志一样简单可能足以使您的假设无效。

关于c - 是否没有必要在 8 的倍数地址处存储结构的 double 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19030362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com