struct __declspec(align(16)) sse_t{};
和 struct alignas(16) sse_t{};
有什么区别?
链接到 C++11 中结构对齐的示例:http://en.cppreference.com/w/cpp/language/alignas
// every object of type sse_t will be aligned to 16-byte boundary
struct alignas(16) sse_t
{
float sse_data[4];
};
// the array "cacheline" will be aligned to 128-byte boundary
alignas(128) char cacheline[128];
然而,MSVS2012 中没有关键字alignas(16)
,但您可以使用__declspec(align(16))
:Where can I use alignas() in C++11?
我们可以在示例中看到:
#include <iostream>
#ifdef __GNUC__
struct __attribute__(align(16)) sse_t
#else
struct __declspec(align(16)) sse_t
#endif
{
float sse_data[4];
};
/*
// Why doesn't it support in MSVS 2012 if it is the same as __declspec(align(16)) ?
struct alignas(16) sse_t
{
float sse_data[4];
};
*/
int main() {
// aligned data
sse_t ab;
ab.sse_data[1] = 10;
// what will happen?
unsigned char *buff_ptr = new unsigned char [1000]; // allocate buffer
sse_t * unaligned_ptr = new(buff_ptr + 3) sse_t; // placement new
unaligned_ptr->sse_data[1] = 20;
int b; std::cin >> b;
return 0;
}
- 对齐的这些功能是等价的吗?
- 如果是这样 - 等价,为什么不在 MSVS2012 中输入关键字
alignas()
,因为此功能已经存在__declspec(align(16))
?< - 如果通过“placement new”将这样的结构放置在未对齐的地址上会发生什么:
new(buff_ptr + 3)
?
最佳答案
- 据我所知,它们是等价的,区别在于
struct alignas(16) sse_t{};
是标准 C++ 而struct __declspec(align(16)) sse_t{};
是 C++11 之前的 Microsoft 扩展。 - Microsoft 没有在 MSVS2012 的编译器中实现
alignas()
,您必须问问他们原因。IIRC 它在 MSVS2013 中受支持。编辑:我是个骗子,MSVS2013 still does not supportalignas
/alignof
. - 如果这样的结构错位,很可能会发生可怕的事情。你甚至不需要放置
new
来这样做,普通的旧new
忽略了超出 C++11 原始类型所需的对齐要求。
关于c++ - struct __declspec(align(16)) sse_t 和 struct alignas(16) sse_t 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19958912/