【发布时间】:2017-12-05 07:08:00
【问题描述】:
我对 linux/gcc 中 double 类型的大小/对齐有疑问。
Wikipedia 上写着:
双精度(8 字节)在 Windows 上是 8 字节对齐的,在 4 字节上对齐 在 Linux 上对齐(带有 -malign-double 编译时间选项的 8 字节)。
我了解 8 字节数据类型是如何以 8 字节对齐的方式存储在内存中的。
如果我们有
struct foo {
double d1;
double d2;
};
我知道这个结构的大小是 16 字节。但是对齐方式是什么?
其次,我们如何可视化 4 字节对齐的 8 字节大小?
举个例子:
int a[2];
在上述情况下,a[0] 的偏移量 = 0,a[1] 的偏移量 =32。
但是在 Linux 中如何为double 类型放置它(4 字节对齐)?例如
double d[2];
d[0] 当然会在 Offset = 0 处。d[1] 应该在 Offset=64 处,但对齐信息表明 double 是 4 字节对齐的。也许我在这里遗漏了一些要点。
【问题讨论】:
-
写一个打印出大小和地址的测试程序怎么样?
-
“我知道这个结构的大小是 16 字节” - 假设错误.. 请提供标准参考。维基百科的陈述要么是错误的,要么是不完整的引用。
-
维基百科的引用非常具体到编译选项 (
-malign-double)。在实践中,如果没有这些特定的编译选项,对齐通常是大小的倍数,而不是它的一小部分。 -
收到好的答案后,您想用它做什么?为什么知道对齐对您很重要?
-
4 字节对齐意味着起始地址可以是 4 的倍数(如 0x10004),而不是在 4 个字节中存储
double。
标签: c linux types memory-alignment