|
|
|
@ -403,6 +403,39 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3), |
|
|
|
|
#error PROTOBUF_FORCE_ALLOCATION_ON_CONSTRUCTION was previously defined |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// Specify memory alignment for structs, classes, etc. |
|
|
|
|
// Use like: |
|
|
|
|
// class PROTOBUF_ALIGNAS(16) MyClass { ... } |
|
|
|
|
// PROTOBUF_ALIGNAS(16) int array[4]; |
|
|
|
|
// |
|
|
|
|
// In most places you can use the C++11 keyword "alignas", which is preferred. |
|
|
|
|
// |
|
|
|
|
// But compilers have trouble mixing __attribute__((...)) syntax with |
|
|
|
|
// alignas(...) syntax. |
|
|
|
|
// |
|
|
|
|
// Doesn't work in clang or gcc: |
|
|
|
|
// struct alignas(16) __attribute__((packed)) S { char c; }; |
|
|
|
|
// Works in clang but not gcc: |
|
|
|
|
// struct __attribute__((packed)) alignas(16) S2 { char c; }; |
|
|
|
|
// Works in clang and gcc: |
|
|
|
|
// struct alignas(16) S3 { char c; } __attribute__((packed)); |
|
|
|
|
// |
|
|
|
|
// There are also some attributes that must be specified *before* a class |
|
|
|
|
// definition: visibility (used for exporting functions/classes) is one of |
|
|
|
|
// these attributes. This means that it is not possible to use alignas() with a |
|
|
|
|
// class that is marked as exported. |
|
|
|
|
#ifdef PROTOBUF_ALIGNAS |
|
|
|
|
#error PROTOBUF_ALIGNAS was previously defined |
|
|
|
|
#endif |
|
|
|
|
#if defined(_MSC_VER) |
|
|
|
|
#define PROTOBUF_ALIGNAS(byte_alignment) __declspec(align(byte_alignment)) |
|
|
|
|
#elif defined(__GNUC__) |
|
|
|
|
#define PROTOBUF_ALIGNAS(byte_alignment) \ |
|
|
|
|
__attribute__((aligned(byte_alignment))) |
|
|
|
|
#else |
|
|
|
|
#define PROTOBUF_ALIGNAS(byte_alignment) alignas(byte_alignment) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef PROTOBUF_THREAD_LOCAL |
|
|
|
|
#error PROTOBUF_THREAD_LOCAL was previously defined |
|
|
|
|
#endif |
|
|
|
|