MSVC Win32中的alignof(double)

3
以下是代码(msvc 2012,32位):
#include <iostream>

int main()
{
    double d;
    std::cout<<_alignof(double)<<std::endl;
    std::cout<<((size_t)(&d)) % _alignof(double)<<std::endl;
    return 0;
}

输出有时候是:

8
0

但有时它会是这样:

8
4

alignof(double)=8并不意味着double的对齐方式将是8吗?

我看过: http://msdn.microsoft.com/en-us/library/aa290049(v=vs.71).aspx 但我不确定是否理解...


你的文本中提到了 alignof,但是你的代码中却写成了 _alignof(而且链接的网站又讲到了另外一个 __alignof),我们现在讨论的是哪个?我可以想象它们之间可能存在微妙的差异。 - PlasmaHH
本文告诉您,对于32位代码,堆栈的对齐方式为4,并且编译器会在必要时尽力将其对齐到8。核心问题在于你没有给它足够的理由来这样做。实际上,您必须使用变量才能使其对齐。当您在生成的代码中看到 and esp,0FFFFFFF8h 时,您就知道已经达到了目标。 - Hans Passant
我尝试使用变量,但它仍未对齐为8字节。 - eranb
关于 alignof (c++11 规范) 和 __alignof (微软的) 之间的区别; 我认为这是真正的答案 - 微软没有实现规范中的 alignof,而是称之为类似的函数 __alignof。微软的函数返回结构体内变量的对齐方式,而不是局部和全局变量的对齐方式。 - eranb
1个回答

0

这是因为你在堆栈上取地址(&d),它的起始地址在程序启动时动态计算。_alignof(double)总是返回8,因为对于基本类型来说,它们的大小与_alignof值相同。


2
他的问题可能是为什么堆栈上的变量没有按照他认为的方式对齐。 - PlasmaHH
2
这意味着 _alignof 返回的结果可能与类型实际所需的对齐方式不同。 - Keith Thompson
规范(c++11)关于对齐的说明是:“...在该类型的对象可以分配的地址上的限制。”。它只适用于动态分配吗? - eranb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接