簡體   English   中英

C++ 中 sizeof() 運算符的功能

[英]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類型而不取決於其(相反,對於大多數函數ff(v)的值取決於v的值)。

了解 C++ 的一個好方法是參考標准等文檔或關於它的良好 web 頁面。

如果有人可以解釋我

是的。 閱讀一本關於 C++ 的好書。 這個是C++的主設計師寫的。 嘗試更多更好地理解 C++ 的(困難的)語義 您還可以研究現有開源 C++ 編譯器的源代碼,例如GCCClang/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM