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;
}
alignas()
,因为__declspec(align(16))
已经存在此功能? 最佳答案
struct alignas(16) sse_t{};
是标准C++,而struct __declspec(align(16)) sse_t{};
是C++ 11之前的Microsoft扩展。 alignas()
,您必须问他们为什么。 IIRC在MSVS2013中受支持。编辑:我是骗子,MSVS2013 still does not support alignas
/ alignof
。 new
,普通的旧new
可以忽略对齐要求,而C++ 11则不需要原始类型。