मैं एक कैश सीमा पर अपने प्रकार overalign करना चाहते हैं, तो मैं alignas
प्रयोग किया है:alignas सम्मान कीवर्ड शायद
struct alignas(64) W { };
यह ठीक संकलित करता है। लेकिन फिर भी, मेरे आश्चर्य करने के लिए, जब मैं W
रों का एक समूह को आवंटित करने का प्रयास करते हैं, वे 64-बाइट गठबंधन नहीं कर रहे हैं, लेकिन वास्तव में 16-बाइट गठबंधन:
#include <iostream>
#include <iomanip>
#include <unordered_map>
struct alignas(64) W { };
int main() {
std::unordered_map<int, int> offset;
for (int i = 0; i < 1000; ++i) {
auto w = new W;
offset[(uintptr_t)w % 64]++;
}
for (const auto& p : offset) {
std::cout << p.first << ' ' << p.second << '\n';
}
}
पैदावार:
0 250
16 250
32 250
48 250
पर कई संकलन (जीसीसी 4.8.2, जीसीसी 5.2.0, क्लैंग 3.7.1)। क्या हो रहा है? मैंने इसे संरेखित करने के लिए कहा, यह संरेखित क्यों नहीं है?
["यह क्रियान्वयन-परिभाषित है कि अति-संरेखित प्रकार समर्थित हैं (\ [basic.align \])।"] (Http://eel.is/c++draft/expr.new#1)। यह भी देखें [सीडब्ल्यूजी मुद्दा 2130] (http://wg21.link/cwg2130)। –
@ टी.सी. ऐसा लगता है कि यह एक जवाब होना चाहिए। – NathanOliver
@ टी.सी. मुझे कैसे पता चलेगा कि एक कार्यान्वयन इसका समर्थन करता है (स्पष्ट रूप से न तो जीसीसी और न ही झुकाव) – Barry