struct __declspec(align(16))sse_t和struct alignas(16)sse_t有什么区别?

时间:2013-11-13 16:18:01

标签: c++ c++11 memory-alignment

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;
}
  1. 这些对齐功能是相同的吗?
  2. 如果是这样 - 等效,为什么没有在MSVS2012中输入关键字alignas(),因为此功能已经存在__declspec(align(16))
  3. 如果这样的结构通过“放置新位置”放置在未对齐的地址上会发生什么:new(buff_ptr + 3)

1 个答案:

答案 0 :(得分:4)

  1. 据我所知,它们是等价的,区别在于struct alignas(16) sse_t{};是标准C ++而struct __declspec(align(16)) sse_t{};是C ++ 11之前的Microsoft扩展。
  2. 微软没有在MSVS2012的编译器中实现alignas(),你必须问问他们原因。 IIRC在MSVS2013中得到支持。编辑:我是个骗子,MSVS2013 still does not support alignas / alignof
  3. 如果这种结构错位,可能会发生可怕的事情。您甚至不需要放置new来执行此操作,普通旧new忽略了对齐要求,超出了C ++ 11中原始类型所需的对齐要求。