c++ 管理簡單的型別
我發現微不足道的錯綜複雜的C不平凡,理解和希望有人能夠啟發我在下面.
給定型別T,使用:: operator new(std :: size_t)或:: operator new [](std :: size_t)或std :: aligned_storage分配的T的儲存,以及指向該儲存中的位置的void * p適當地對齊於T,使得其可以在p:
>如果std :: is_trivially_default_constructible<T> :: value hold,當代碼在p上跳過T初始化時(即通過使用T * tPtr = new(p)T();),程式碼呼叫未定義的行為,否則訪問* p如T?只能使用T * tPtr = static_cast<T *>(p);而不用擔心在這種情況下的未定義的行為?
>如果std :: is_trivially_destructible<T> :: value hold,則會跳過T在* p的破壞(即,通過呼叫tPtr-> T();)導致未定義的行為?
>對於任何型別U,其中std :: is_trivially_assignable<T,U> :: value hold,是std :: memcpy(& t,& u,sizeof(U));相當於t = std :: forward<U>(u); (對於T型和U型U型),否則會導致未定義的行為?
.
只是為了澄清[basic.life]/1 的措辭,這表明從空閒初始化的物件從儲存分配開始就活著:該措辭顯然是指物件的初始化.當使用operator new或malloc分配原始儲存時,沒有初始化為空的物件,因此“it”不存在,因此我們無法考慮“it”.事實上,只有在具有空虛初始化的定義建立的物件可以在儲存被分配之後,但是在空虛初始化發生之前被訪問(即,遇到它們的定義).
>忽略解構函式呼叫永遠不會導致未定義的行為.然而,嘗試在這一領域中的任何優化是毫無意義的.模板,因為一個微不足道的解構函式才被優化.
>現在,要求是being trivially copyable ,型別必須匹配.但是,這可能太嚴格了.Dos Reis’s N3751 至少提出不同型別的工作,我可以想象,這個規則在將來被擴充套件到一種型別的微不足道的副本分配.
然而,你具體顯示的並不是很有意義的(尤其是因為你要求賦值給一個標量x值,這是一個不合格的),因為微不足道的賦值可以在其實際上不是“簡單的“,就是具有與memcpy相同的語義.例如. is_trivially_assignable<int& double>並不意味著可以通過複製物件表示來將“分配”給對方.
http://stackoverflow.com/questions/42294487/managing-trivial-types