結構成員對齊選項設定的問題

2022-04-03 23:30:45 字數 1093 閱讀 7194

最近在ai外掛程式中引入qt,想利用其介面功能做些ai中缺乏的**等控制項,來展示資料。當中用到了繼承基類qtablewidget來實現自定義的新類,引入了四個新的成員變數,為string型別,編譯過程很順利,沒有什麼問題,在debug階段程式跑起來後,執行到新定義的類的物件的方法的時候,程式直接掛掉。後來嘗試將這幾個成員注釋掉,結果程式正常執行。但是我又特別需要幾個私有資料成員,原本想從建構函式中初始化,就可以用了,但是被目前的問題憋了很久,幾乎崩潰。後來找高人看了下,將原來的string型別資料成員注釋掉,新增新的qt自己的資料型別,結果也都掛掉。

轉機出現在嘗試了乙個int* 資料型別成員變數放在所有成員變數的最前面。結果居然就行了,嗚呼怪哉!

後來牛人發現可能跟位元組對齊有關,即屬性配置裡面的結構成員對齊設定:就是這麼個東西,要了親命了

結果將原來的2位元組改成預設值 ,將那個新加的int* 型別資料成員注釋掉也是可以的。

至此:問題得到解決,那麼位元組對齊又是什麼個意思呢?查下msdn裡面的注釋如下:

控制結構的成員如何封裝到記憶體並為模組中的所有結構指定相同的封裝。

/zp[1|2|4|8|16]

備註當指定此選項時,第乙個結構成員後的每個結構成員將儲存在成員型別大小或 n 位元組邊界(其中 n 為 1、2、4、8 或 16)兩者中較小的乙個邊界上。

下表描述了可用的值。

1在 1 位元組邊界上封裝結構。與/zp相同。

2在 2 位元組邊界上封裝結構。

4在 4 位元組邊界上封裝結構。

8在 8 位元組邊界上封裝結構(預設操作)。

16在 16 位元組邊界上封裝結構。

除非有特定的對齊要求,否則不應使用此選項。

還可以使用 pack 控制結構封裝。有關對齊方式的更多資訊,請參見:

開啟此專案的「屬性頁」對話方塊。有關詳細資訊,請參見如何:開啟專案屬性頁。

單擊「c/c++」資料夾。

單擊「**生成」屬性頁。

修改「結構成員對齊」屬性。

請參見參考

編譯器選項

設定編譯器選項

結構體成員對齊的問題

現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。1 現象 比如有些平台每次讀都是從偶位址開始...

struct的成員對齊問題

1 自然對界 struct 是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float 等 的變數,也可以是一些復合資料型別 如array struct union 等 的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成...

c 的所有結構成員介紹

乙個結構的成員是在這個結構中宣告的而且從類object 中繼承的成員。與結構型別成員直接相關的簡單型別的成員由簡單型別給出別名 sbyte 的成員是結構system.sbyte 的成員。byte 的成員是結構system.byte 的成員。short 的成員是結構system.int16 的成員。u...