Naz*_*554 9 c++ memory-alignment visual-c++ c++11
我已经在ideone.com上测试了这个代码并且16它应该输出.但是,当我在Visual Studio 2013中尝试它时,它显示8.它是编译器的错误还是缺少C++ 11支持?
#include <iostream>
#include <type_traits>
using namespace std;
using float_pack = aligned_storage<4 * sizeof(float), 16>::type;
int main() {
cout << alignment_of<float_pack>::value << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用了alignment_of,因为MSVC不支持alignof.
编辑:我看到我无法16与之对齐aligned_storage.但为什么这个片段没问题呢?
#include <iostream>
#include <type_traits>
#include <xmmintrin.h>
using namespace std;
__declspec(align(16)) struct float_pack {
float x[4];
};
int main()
{
cout << alignment_of<float_pack>::value << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出是16.这是否意味着编译器在使用扩展时可以提供更大的对齐?为什么我不能达到同样的效果aligned_storage?只是因为MSVC没有提供那个aligned_storage?
看起来std::max_align_t是8,在现场观看:
std::cout << alignment_of<std::max_align_t>::value << '\n';
Run Code Online (Sandbox Code Playgroud)
在草案C++标准部分3.11 Alignment中它说:
基本对齐由小于或等于所有上下文中实现所支持的最大对齐的对齐表示,其等于alignof(std :: max_align_t)(18.2).[...]
这说明这是实现支持的最大对齐,这似乎得到了这个提升文档的支持,该文档说:
扩展对齐由大于alignof(std :: max_align_t)的对齐表示.它是实现定义的,是否支持任何扩展对齐以及支持它们的上下文.具有扩展对齐要求的类型是过度对齐类型.
max_align_t詹姆斯告诉我们的是与基本联盟相关的标准8 bytes.虽然扩展不必坚持这一点,只要记录下来,如果我们阅读__declspec对齐的文档,我们会看到它说:
编写使用最新处理器指令的应用程序会引入一些新的约束和问题.特别是,许多新指令要求数据必须与16字节边界对齐.此外,通过将常用数据与特定处理器的缓存行大小对齐,可以提高缓存性能.例如,如果定义大小小于32个字节的结构,则可能需要将其与32个字节对齐,以确保有效地缓存该结构类型的对象.
[...]
如果没有__declspec(align(#)),Visual C++会根据数据大小对自然边界上的数据进行对齐,例如4字节边界上的4字节整数和8字节边界上的8字节双精度.类或结构中的数据在类或结构中以其自然对齐和当前打包设置(来自#pragma pack或/ Zp编译器选项)的最小值对齐.
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |