nothrow是在C++標準標頭檔<new>中定義的一個nothrow_t類的對象。nothrow_t類是這樣定義的:
struct nothrow_t { };
可見它只是一個什麼都不做的空類。new僅僅使用這個空類對象達到一種標識作用,而不是利用這個類對象的功能。通常稱這樣的類對象為預留位置。
C++標準規定 new 在分配記憶體失敗的時候會拋出異常,因此在C++程式中應該通過捕捉異常來處理記憶體失敗的情況。與之不同,傳統的C語言中的malloc()函數分配記憶體失敗時返回NULL指標。為了提供與malloc()函數一致的行為,即在記憶體配置失敗時返回一個NULL指標,而不是拋出異常,C++還提供了 nothrow(不拋出異常) 版本的 new,即 new(nothrow)。利用 new(nothrow),可以通過判斷其返回的指標值是否為NULL從而判斷記憶體配置是否成功。
--
指標轉換通常不用這個.因為如果你希望指標的類型轉換,那麼直接用(xxx*)這種形式或者static_cast就可以轉換了,而且這種轉換如果有問題編譯器也會提示,如果不提示那麼這種轉換也是自然的,也就是說是安全的.
reinterpret_cast操作符修改了運算元類型,但僅僅是重新解釋了給出的對象的位元模型而沒有進行二進位轉換.
例如:int *n= new int ;
*n = 9;
double *d=reinterpret_cast<double*> (n);
在進行計算以後, d 包含無用值. 這是因為 reinterpret_cast 僅僅是複製 n 的位元位到 d, 沒有進行必要的分析,d中列印結果也不是9。 但是如果用static_cast轉換,那麼d的值還是9,進行過安全的分析了
--
這是因為你的C/C++編譯器進行了字對齊調整的緣故。
為了提高運行效率,有些編譯器在預設的情況下做字對齊甚至雙字對齊調整, 所有變數的存放起始地址都調整為字長的整數倍。即若字長32位,4位元組,則所有變數的存放起始地址都是4的整數倍,而double類型更要起始在8的整數倍(雙字對齊)。
於是,一個S2的結構就會這樣儲存(位移量用十進位表示):
+0000 S2.c
+0004 S2.S1.a // 本來起始地址0001, 不是4的倍數,所以調整到0004
+0008 S2.S1.b // 調整到0008. 這個long變數實際佔4位元組。
+0016 S2.e // 本來起始地址0012, 不是8的倍數,所以調整到0016
+0024 ---- // double 本身佔8位元組,所以到這裡就24位元組了。
另外,如果一個結構含有雙字類型的成員,他的大小也要調整成8的倍數。所以,如果在S2最後再加上一個成員char f, 那麼它總的大小將是32位元組。
當然,提高運行效率的同時浪費了一些儲存空間。
有些編譯器有對齊的選項,可以選擇字對齊,半字對齊或雙字對齊。編譯時間如果禁止對齊調整,則所有的變數也都是連續存放的。