如果我定義了一個具有一定對齊要求的簡單類型,那麼所有類型的std::vector<t>
都不應該爲每個單個元素提供對齊?應該std :: vector榮譽alignof(value_type)?
請看下面的例子
typedef std::array<double,3> alignas(32) avx_point;
std::vector<avx_point> x(10);
assert(!(std::ptrdiff_t(&(x[0]))&31) && // assert that x[0] is 32-byte aligned
!(std::ptrdiff_t(&(x[1]))&31)); // assert that x[1] is 32-byte aligned
我發現,對齊要求,就是靜靜地(無任何警告)由鐺3.2(有或無-stdlib=libc++
)侵犯,而GCC 4.8.0發出警告,它忽略std::vector
(英特爾編譯器太愚蠢,無法理解alignas
,但如果我使用__declspec(align(32))
,則它的行爲類似於clang)的模板參數上的屬性。兩者都創建觸發斷言的代碼。
那麼,這是正確的行爲還是一個叮噹(和icpc)的錯誤和gcc的問題?
編輯 回答在意見中提出了一個問題:如果我定義
typedef typename std::aligned_storage<sizeof (avx_point),
alignof(avx_point)>::type avx_storage;
我得到
sizeof (avx_storage) == 32;
alignof(avx_storage) == 32;
但std::vector<avx_storage>
仍然無法對齊第一個元素(因此所有的其他人也)爲叮噹聲和海灣合作委員會(這次沒有警告)。所以顯然存在兩個問題:第一,std::allocator<type>
即使對於第一個元素(非法?)也忽略任何對齊要求,其次,沒有填充用於確保後續元素的對齊。
出於興趣,如果你比較'的std ::向量<性病:: aligned_storage <的sizeof(avx_point),32 >>'會發生什麼? – Useless 2013-05-07 17:51:18