|
@@ -420,3 +420,32 @@
|
|
#else
|
|
#else
|
|
#define PROTOBUF_ASSUME(pred) GOOGLE_DCHECK(pred)
|
|
#define PROTOBUF_ASSUME(pred) GOOGLE_DCHECK(pred)
|
|
#endif
|
|
#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.
|
|
|
|
+#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
|