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”将这样的结构放置在未对齐的地址上,将会发生什么?
  • 最佳答案

  • 据我所知它们是等效的,不同之处在于struct alignas(16) sse_t{};是标准C++,而struct __declspec(align(16)) sse_t{};是C++ 11之前的Microsoft扩展。
  • 微软还没有在MSVS2012的编译器中实现alignas(),您必须问他们为什么。 IIRC在MSVS2013中受支持。编辑:我是骗子,MSVS2013 still does not support alignas / alignof
  • 如果这种结构未对齐,可能会发生可怕的事情。您甚至不需要这样做就可以放置new,普通的旧new可以忽略对齐要求,而C++ 11则不需要原始类型。
  • 07-24 09:44