|
111 | 111 | // See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0154r1.html
|
112 | 112 | // for more information.
|
113 | 113 | //
|
114 |
| -// On some compilers, `ABSL_CACHELINE_ALIGNED` expands to |
115 |
| -// `__attribute__((aligned(ABSL_CACHELINE_SIZE)))`. For compilers where this is |
116 |
| -// not known to work, the macro expands to nothing. |
| 114 | +// On some compilers, `ABSL_CACHELINE_ALIGNED` expands to an `__attribute__` |
| 115 | +// or `__declspec` attribute. For compilers where this is not known to work, |
| 116 | +// the macro expands to nothing. |
117 | 117 | //
|
118 | 118 | // No further guarantees are made here. The result of applying the macro
|
119 | 119 | // to variables and types is always implementation-defined.
|
|
122 | 122 | // of causing bugs that are difficult to diagnose, crash, etc. It does not
|
123 | 123 | // of itself guarantee that objects are aligned to a cache line.
|
124 | 124 | //
|
| 125 | +// NOTE: Some compilers are picky about the locations of annotations such as |
| 126 | +// this attribute, so prefer to put it at the beginning of your declaration. |
| 127 | +// For example, |
| 128 | +// |
| 129 | +// ABSL_CACHELINE_ALIGNED static Foo* foo = ... |
| 130 | +// |
| 131 | +// class ABSL_CACHELINE_ALIGNED Bar { ... |
| 132 | +// |
125 | 133 | // Recommendations:
|
126 | 134 | //
|
127 | 135 | // 1) Consult compiler documentation; this comment is not kept in sync as
|
|
131 | 139 | // 3) Prefer applying this attribute to individual variables. Avoid
|
132 | 140 | // applying it to types. This tends to localize the effect.
|
133 | 141 | #define ABSL_CACHELINE_ALIGNED __attribute__((aligned(ABSL_CACHELINE_SIZE)))
|
134 |
| - |
135 |
| -#else // not GCC |
| 142 | +#elif defined(_MSC_VER) |
| 143 | +#define ABSL_CACHELINE_SIZE 64 |
| 144 | +#define ABSL_CACHELINE_ALIGNED __declspec(align(ABSL_CACHELINE_SIZE)) |
| 145 | +#else |
136 | 146 | #define ABSL_CACHELINE_SIZE 64
|
137 | 147 | #define ABSL_CACHELINE_ALIGNED
|
138 | 148 | #endif
|
|
0 commit comments