為什麼在C/C++中,結構體的sizeof不等於每個成員的sizeof總和?
sizeof() 所取得的結構類型元素的大小並不總是等於每個單獨成員的大小。有時編譯器會添加一些填充以避免對齊問題。所以尺寸可能會改變。當結構成員後面跟著一個尺寸較大的成員或位於結構末端時,將添加填充。不同的編譯器有不同類型的對齊約束。在 C 標準中,總對齊結構取決於實作。
情況 1
在這種情況下,雙精確度 z 為 8 位元組長,大於 x(4 位元組) )。因此又增加了 4 個位元組的填充。此外,短類型資料 y 在記憶體中具有 2 個位元組空間,因此添加了額外的 6 個位元組作為填充。
範例程式碼
#include <stdio.h> struct myStruct { int x; //Integer takes 4 bytes, and padding 4 bytes double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
輸出2
Size of struct: 24
情況2
在這種情況下,先插入雙精度數,它佔用8 位元組的空間。現在加入了整數 x(4 位元組)。所以還有另外4個位元組的空間。新增短y後,可以放入額外的4位元組空間中,總共佔用16位元組空間。
範例程式碼
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding int x; //Integer takes 4 bytes, and padding 4 bytes short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
輸出2
Size of struct: 16
情況3
第三種情況也佔用16位元組的記憶體空間,但排列方式不同。由於第一個成員是double,所以首先放置,然後再加入short 類型資料。現在,當整數嘗試插入時,可以將其放入剩餘的 6 位元組區域中。因此,short 之後存在一個填充,但整數資料之後不需要填充。
範例程式碼
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes int x; //Integer takes 4 bytes, and padding 4 bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
輸出2
Size of struct: 16
以上是為什麼在C/C++中,結構體的sizeof不等於每個成員的sizeof總和?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

在C中,結構體和數組都用作數據類型的容器,即在結構體和數組中我們都可以存儲數據,也可以對它們執行不同的操作。基於內部實現,以下是兩者之間存在一些基本差異。 Sr.編號鍵結構數組1定義結構體可以定義為一種資料結構,用作容器,可以容納不同類型的變數。另一方面,數組是一種用作容器的資料結構,可以容納相同類型的變量,但不支援多種資料類型變數。 2記憶體分配輸入資料的記憶體分配結構不必位於連續的記憶體位置。而在數組的情況下,輸入資料儲存在連續的記憶體分配中,這意味著數組將資料儲存在分配連續記憶體區塊的記憶體模型中(即,具有

Golang中結構體強轉是將一種結構體類型的值轉換為另一種類型。可以透過斷言強轉、反射強轉、指針間接強轉等技巧來實現。斷言強轉使用型別斷言,反射強轉使用反射機制,指標間接強轉避免值複製。具體步驟為:1.斷言強轉:使用typeassertion語法;2.反射強轉:使用reflect.Type.AssignableTo和reflect.Value.Convert函數;3.指標間接強轉:使用指標解引用。

結構體在PHP的應用與操作方法隨著PHP語言的不斷發展壯大,其功能也日益完善。除了常見的變數和數組,PHP還提供了一種更靈活的資料類型,即結構體(Struct)。結構體是一種由多個不同類型的資料成員組成的複合資料類型。它可以將相關資料組合,形成一個更完整、更有結構的資料。在PHP中,可以透過使用類別和物件來模擬結構體的行為和功能。首先,我們來看看如何

使用json.Marshal函數將結構體轉換為JSON字串在Go語言中,可以使用json.Marshal函數將結構體轉換為JSON字串。結構體是一種由多個欄位組成的資料類型,而JSON是一種常用的輕量級資料交換格式。將結構體轉換為JSON字串可以方便地在不同系統之間交換資料。下面是一個範例程式碼:packagemainimport(&q

這裡我們來看看什麼是C語言中的匿名聯合體和結構體。匿名聯合體和結構體就是未命名的聯合體和結構體。由於它們沒有名稱,因此我們無法建立它的直接物件。我們將其用作嵌套結構或聯合。這些是匿名聯合和結構的範例。 struct{ datatypevariable; ...};union{ datatypevariable; ...};在這個例子中,我們正在創建

php與c#的差異有:1、語言型別系統不同,PHP屬於動態,而C#為靜態型別;2、使用的平台不同,PHP可實現跨平台,而C#為Windows專屬;3、程式設計範式不同,PHP支援物件導向、過程化和函數式編程,C#更傾向於物件導向編程;4、執行速度不同,PHP速度更快,C#相對較慢;5、應用場景不同,PHP應用於Web開發、伺服器等, C#用於Windows桌面和網路應用程式。

使用json.Unmarshal函數將JSON字串解析為結構體在Go語言中,可以使用json.Unmarshal函數將JSON字串解析為結構體。這是一個非常有用的功能,特別是在處理API回應或讀取設定檔時。首先,我們要定義一個結構體類型,來表示我們要解析的JSON物件的結構。假設我們有如下的JSON字串:{"name"

Inthistutorial,wewillbediscussingaprogramtocreateaC/C++codeformattingtoolwiththehelpofclangtools.SETUPsudoaptinstallpythonsudoaptinstallclang-format-3.5然後我們將在當前用戶具有讀寫權限的位置創建一個Python檔案。範例importoscpp_extensions=(".cxx",".cpp&
