What is the difference between struct __declspec(align(16)) sse_t and struct alignas(16) sse_t?

StackOverflow https://stackoverflow.com/questions/19958912

  •  30-07-2022
  •  | 
  •  

Вопрос

What is the difference between struct __declspec(align(16)) sse_t{}; and struct alignas(16) sse_t{};?

Link to an example of the alignment of structures in 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];

However, there is not in MSVS2012 keyword alignas(16), but you can use __declspec(align(16)): Where can I use alignas() in C++11? What we can see in example:

#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. These functionalities of alignment are equivalent?
  2. And if so - equivalent, why did not entered keyword alignas() in MSVS2012, because this functionality is already there __declspec(align(16))?
  3. And what will happen if such a structure to place on a misaligned address through "placement new": new(buff_ptr + 3)?
Это было полезно?

Решение

  1. To my knowledge they are equivalent, the difference being that struct alignas(16) sse_t{}; is standard C++ and struct __declspec(align(16)) sse_t{}; is a pre-C++11 Microsoft extension.
  2. Microsoft hadn't gotten around to implementing alignas() in their compiler in MSVS2012, you'd have to ask them why. IIRC it is supported in MSVS2013. EDIT: I'm a liar, MSVS2013 still does not support alignas / alignof.
  3. Horrible things will likely happen if such a structure is misaligned. You don't even need placement new to do so, plain old new is oblivious to alignment requirements beyond those needed for primitive types as of C++11.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top