該標準以某種方式保證sizeof(typename aligned_storage<...>::type)
是可以寫入對齊存儲的數據的實際可用大小嗎?我問這個問題的原因是我正在實現一個std :: function樣式的對象,如果該對象適合一些小的aligned_storage,就可以避免堆分配。sizeof std :: aligned_storage實際可用的存儲大小?
我看着的libC++實現的std ::函數構造函數(它做到這一點),測試他們執行,以確保傳遞類型將適合的排列存儲只是......
if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value)
{
__f_ = (__base*)&__buf_;
::new (__f_) _FF(_VSTD::move(__f));
}
其中__buf_
是aligned_storage,_FF
是類型擦除傳遞仿函數的包裝類,而_Fp
是該仿函數類型。
我假設這不是保證,它(可能?)只是作爲aligned_storage的libC++實現的結果發生。
我不確定你的想法不能保證。 sizeof(X)'是'X'的大小?如果您可以在POD數據中的任何地方寫入數據並將其視爲普通的舊數據? – Yakk 2014-10-27 17:45:06
你可以寫'sizeof(__ buf_)'字節,以'&__ buf_'開始。例如,libC++中使用的實際對齊的存儲是'typename aligned_storage <3 * sizeof(void *)> :: type __buf_;'(在我的機器上)sizeof = 32,'3 * sizeof(void *)' = 24,所以對sizeof(__buf_)的檢查實際上超過了我們所要求的std :: aligned_storage的8個字節,並且顯然,放置構造函數可以在對齊的存儲之外寫入。 – pat 2014-10-27 17:58:28
@pat:放置構造函數無法在對齊的存儲之外進行寫操作,而是將其向後移動。放置構造函數只使用存儲的第一部分,剩下一些「填充」。無關,對我來說似乎很奇怪,'aligned_storage'會給你額外的空間,儘管測試證實。 – 2014-10-27 18:19:20