[英]Functioning of sizeof() operator in C++
為了了解標准 c++ 庫sizeof()的 function 的功能,我編寫了一個簡單的程序。
它遵循:
const char* array[] = {
"1234",
"5678"
};
std::cout << sizeof(array) << std::endl;//16
std::cout << sizeof (array[0]) << std::endl;//8
std::cout << printf("%lu\n",sizeof (char) );//1
std::cout << printf("%lu\n",sizeof (int) );//24
std::cout << printf("%lu\n",sizeof (float) );//24
std::cout << printf("%lu",sizeof (double) );//281
正如預期的那樣,output 報告的字符在我的操作系統中的維度為 1 字節,這是可能的。 但我不明白為什么 '''array[0]''' 的維度是 8,因為它包含 4 個字符和至少其他 2 個字符,用於包含在字符串中的結束序列“\n”。 因此,我假設數組的第一個元素占用的字節數應該是 6 而不是 8。此外,如果我增加/減少數組第一個元素中包含的字符數,它的大小不會改變. 很明顯,我錯了。 如果有人可以向我解釋這種功能,我將不勝感激。 謝謝,
為了理解標准c++庫sizeof()的function的作用,我寫了一個簡單的程序。
錯誤的術語。 請閱讀n3337 (C++ 標准)和sizeof上的維基頁面。
sizeof
是編譯時運算符,而不是function 。 如果v
是某個變量,則sizeof(v)
僅取決於v
的類型而不取決於其值(相反,對於大多數函數f
, f(v)
的值取決於v
的值)。
了解 C++ 的一個好方法是參考標准等文檔或關於它的良好 web 頁面。
如果有人可以解釋我
是的。 閱讀一本關於 C++ 的好書。 這個是C++的主設計師寫的。 嘗試更多更好地理解 C++ 的(困難的)語義。 您還可以研究現有開源 C++ 編譯器的源代碼,例如GCC或Clang/LLVM (從而有效地使用您的自由軟件自由之一)。
順便說一句,您可能會發現sizeof(int)
為 1 的 C++ 實現非常痛苦(例如,對於某些DSP處理器)。 在便宜的 32 位ARM處理器上(例如,今天在廉價手機中的處理器;那么您可能會使用一些交叉編譯器)或在某些Raspberry Pi (或者可能是一些大型機)上,您可以使用sizeof(array[0])
或sizeof(void*)
即使在 2019 年也是 4。
讓我們分解一下您看到的有點令人困惑的 output 值的含義!
首先, sizeof(array)
和sizeof(array[0])
(您的 output 方法很好)。 您已將array
定義/定義為兩個char*
值的數組,每個值都是一個指針。 您系統上的指針大小為 8 個字節,因此array
的總大小為: 8 * 2 = 16 。 對於array[0]:這是一個單指針,所以它的大小只有8個字節。
到目前為止,這一切有意義嗎? 如果是這樣,那么讓我們看看你的代碼的第二部分......
sizeof(char)
、 sizeof(int)
、 sizeof(float)
和sizeof(double)
的值在您的系統上依次為 1、4、4 和 8。這些值實際上是 output,但是,如您還將輸出printf()
的返回值,即它寫入的字符數,您將獲得額外的值,“2”、“2”、“2”和“1”插入(令人困惑,並且可能未定義,順序),對於四個調用(最后一個沒有換行符,所以它只有一個字符;所有其他都是一位數字 + 換行符 = 2 個字符)。
如下更改代碼的第二部分,以獲得正確的輸出:
printf("%zu\n", sizeof(char)); //1
printf("%zu\n", sizeof(int)); //4
printf("%zu\n", sizeof(float)); //4
printf("%zu\n", sizeof(double)); //8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.