久久亚洲精品成人_国产精品欧美综合亚洲_亚洲va天堂va欧美ⅴa在线_91色视频在线观看_久久影院亚洲_一级黄色片播放_日韩av在线一区_精品一区二区在线看_老头吃奶性行交视频_日韩免费高清视频_天天操天天爽天天干_日本欧美在线视频

首頁 > 編程 > C > 正文

結構成員對齊與序列化

2023-06-09 12:08:02
字體:
來源:轉載
供稿:網友

在許多廣泛應用的程序庫,我們會看到類似 #pragma pack(push, 4) 等這樣的標示。因為用戶會任意更改他們的結構成員對齊選項,對于先于這些內容創建的程序庫來說,不能確保一定的內存布局將可能在預先書寫的一些數據訪問模塊上導致錯誤,或者根本不可能實現。

我在實現一種C++ 類的實例的序列化工具時,依賴了內存布局。我知道市面上很多“序列化”工具允許更為廣泛的通信用途,但是它們也是用起來最麻煩的,有很多限制條件。我實現的序列化工具用意很明顯,為特定運行模塊提供便捷高效的持久化存儲能力。

為了提供感性的認識,提供了一個使用這個序列化工具的類型定義。

class StorageDoc
        : public SerialOwner
{
public:
        Serializable(StorageDoc);

        char c;
        int i;
        SerialString str;
};

它繼承自 SerialOwner,它聲明了 Serializable,隱含著實現了一些接口,為基類訪問當前類型信息提供幫助。這是較早書寫的一種方案,現在我會改用模板以便在編譯時建立類型信息,不過原理完全一樣。

現在,StorageDoc 當中的內存布局需要可確定的,但是用戶會選擇不同的結構成員對齊選項,為此需要設定一個結構成員對齊的“子域”,完成這項能力的偽指令是 #pragma pack。

#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )

1)當選用 show,則添加一條警告信息,指示當前編譯域內的對齊屬性
2)僅僅設置 n,則重寫編譯器選項 /Zp,并影響到此聲明以下的同一個編譯單元內的所有結構定義
3)push 以及 pop 管理了一組“子域”堆棧,可以不斷加深嵌套
4)identifier 命名了堆棧上的對齊項,以便在特定需求中彈出合適的項目

以下是使用的注意事項:

1)不論何時,#pragma pack() 總是恢復到 /Zp 的預設值,即使處于 push 的“子域”
2)#pragma pack(push) 未指定對齊值,則不改變
3)#pragma pack(pop) 可指定對齊值出棧后的設置值,若不指定則按嵌套等級還原,直至 /Zp 預設值

綜上,#pragma pack(pop) 總是能正確回退到上一個作用域,不管該作用域通過 #pragma pack(n) 聲明或者 #pragma pack(push, n)。而 #pragma pack() 總是取預設值。對于用戶事先指定了一個“子域”,并在其中引入了一個使用 #pragma pack(n) - #pragma pack() 對而非堆棧形式來聲明局部結構成員對齊的頭文件,會使用戶非常困惑。<d3d9types.h> 就是這樣做的。

當我們為程序庫編譯運行時,有一些類型要求嚴ge地遵守內存布局,比如一些硬件允許我們傳入的數據就需要這么做,就可以把它們限定起來:

#pragma pack(push, 8)

#include "Chain.h"
#include "ByteQueue.h"
#include "SerialOwner.h"
#include "SerialUser.h"
#include "SerialString.h"
#include "SerialStream.h"

#pragma pack(pop)

事情再回到序列化上面,用戶會多次嘗試編譯他們的序列化應用模塊,并指望前一次編譯之后運行所產生的文件仍然是可用的,所以還需要在用戶文件當中明確所選用的對齊值,并一旦確定就不再更改:

#pragma pack(push, 8)
class StorageDoc
        : public SerialOwner
{
public:
        Serializable(StorageDoc);

        char c;
        int i;
        SerialString str;
};
#pragma pack(pop)

并使用它們:

StorageDoc doc;

doc.Load(t("doc.bin"));
std::cout << doc.str.Get() << std::endl;

doc.str = ss.str();
std::cout << doc.str.Get() << std::endl;
doc.Save(t("doc.bin"));

這就是全部了,但是正如以上提到的,不僅僅在序列化上,和硬件、鏈接庫的通信也可能存在嚴ge的內存布局的要求,如果你在項目設計上遭遇這些困惑,那么現在就可以立即動手解決它們。

如果對本文提到的序列化能力感興趣的話,可以到以下鏈接了解詳情:

http://code.google.com/p/los-lib/source/browse/

目錄是:

svn/trunk/Inc/Los/

文件分別是:

_ISerialUser.h
ByteQueue.h
Chain.h
Serialization.h
SerialOwner.h
SerialStream.h
SerialString.h
SerialUser.h

不過在本文發布之時,以上文件所處版本沒有針對結構成員對齊選項進行修改,但并不影響閱讀。

* 補充一(2009-1-18 02:41)

聯合以及結構的結構成員對齊異常

class Tick
{
        static int _StaticID;

        __int64 _StartLI; // __alignof(LARGE_INTEGER) != __alignof(__int64)
        __int64 _CurrentLI;
        __int64 _Frequency;

        int _ID;
        clock_t _Start;
        clock_t _Current;

        bool _Stop;
        bool _HighPerformance;
...
}

LARGE_INTEGER 是分別對應兩個 32bit 以及一個 64bit 類型的聯合,奇怪的是隨著全局對齊選項的修改,LARGE_INTEGER 類型本身的請求對齊 __alignof(LARGE_INTEGER) 將取聯合的成員的最大者同全局對齊選項的最小值,也就是說,當 /Zp 設置為 2,那么 LARGE_INTEGER 也將僅承諾在 2 字節邊界上對齊,多么不幸啊。當然如果將這個類型納入 #pragma pack 的限定域那就什么問題都沒有了,不管聯合的對齊算法多么的古怪,只要保證不修改所需的對齊值那將總是能獲得確定的內存布局。

不過正如上面的代碼列出的,我使用了 __int64 代替了 LARGE_INTEGER 的工作,并在請求 Win32 API 的接口上強制指針轉型,使用的時候亦如此,但若訪問聯合成員剛好為 __int64 類型則直接使用便可。這種方式沒有獲得額外的好處,算是一種抗議的行為,并且讓后來的閱讀者有機會了解到這個見不得光的問題。

_HighPerformance = ::QueryPerformanceFrequency((LARGE_INTEGER*)&_Frequency) != 0;

當然作為嚴肅的代碼寫作者,也許你將在不止一處使用到 LARGE_INTEGER,為此我也不拒絕使用如下格式:

#pragma pack(push, 8)
#include <windows.h>
#pragma pack(pop)

它可保證你萬無一失。

作為對比,FILETIME 有如下定義:

typedef struct _FILETIME
    {
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
    }   FILETIME;

且不論它所需的可能的最大結構成員對齊為 4,它也將伴隨著 /Zp 的更改而變動。因此,在不同的選項的影響下:

__alignof(LARGE_INTEGER) != __alignof(FILETIME) != __alignof(__int64)

有些人可能要指責會發生這樣的問題純粹是用戶在玩弄“結構成員對齊選項”而導致的,我真希望他能夠讀一讀這篇文章。

* 補充二(2009-1-18 02:41)

D3D 與用戶定義結構的協調

class VertexXYZ_N_T1
{
public:
        float x, y, z;
        float normal_x, normal_y, normal_z;
        float u, v;
        DeviceBitmap* bitmap;
        Material* material;
        float temp_val;

        static const int FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
};

這是一個自定義頂點結構,它的最大成員字節數為 4,所有的成員也都是 4 字節邊界,不論作何選項,始終保持緊湊存儲,若其中一個成員擴展為 8 字節,那么伴隨著選項的更改,VertexXYZ_N_T1 要求的對齊邊界可導致部分空洞,從而同硬件所需的頂點緩存數據布局存在出入,我不追究硬件是否使用 double 值,但是現在就應當使用

#pragma pack(push, 4)
...
#pragma pack(pop)

加以限定。

我還定義了 Matrix, Material, Vector3, Colorf 等類型,如果要使得這些數據同 D3D, D3DX 的相應類型在內存上兼容的,也是需要限定的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产suv一区二区| 国产999视频| 亚洲第一区第二区| 国产伦精品一区二区三区精品视频| 女人被男人躁得好爽免费视频| 一级片视频免费看| 99国内精品久久| 亚洲一区二区黄| 国产成人无码a区在线观看视频| 日韩乱码一区二区三区| 亚洲精品国产无天堂网2021| 国产精品久久一区主播| 亚洲永久无码7777kkk| 成人一区二区视频| 91精品国产高清久久久久久久久| www欧美激情| 天天摸夜夜添狠狠添婷婷| 欧美乱大交xxxxx另类电影| 99热这里只有精品免费| 亚洲国产精品18久久久久久| 欧美成人自拍视频| 伊人影院在线观看视频| 国产黑丝在线一区二区三区| 欧美性受xxxx白人性爽| 高h视频免费观看| 日韩欧美激情四射| 欧美视频国产视频| 国产精品乱人伦| www.avtt| 亚洲精品国产精华液| 青春草国产视频| 99视频热这里只有精品免费| 99在线视频免费观看| 中文字幕有码无码人妻av蜜桃| 亚洲成人久久久久| 希岛爱理中文字幕| 日韩免费在线观看| 级毛片内射视频| 日韩欧美一二三| 亚洲少妇第一页| 99久久免费国产精精品| 欧美激情性做爰免费视频| 免费亚洲精品视频| 中文字幕日韩三级| 久久国产乱子精品免费女| 久久精品亚洲国产| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲av鲁丝一区二区三区| 精品福利av导航| 成人性生活毛片| 色哟哟一区二区在线观看| 99热成人精品热久久66| 国精产品一区一区三区视频| 免费观看日韩毛片| 中文字幕第100页| 亚洲一级片免费观看| 麻豆免费在线观看视频| 国产精品入口麻豆| 亚洲天堂最新地址| 国产成人亚洲欧洲在线| 最新中文字幕免费| 深夜福利视频网站| 久久国产精品72免费观看| 国产不卡在线视频| 久久久综合九色合综国产精品| 久久久精品天堂| 一区二区欧美视频| 欧美专区亚洲专区| 日韩精品视频免费专区在线播放| 久久黄色av网站| 日本久久久久久| 国产91视觉| 在线视频91| 日韩有码免费视频| 久久人人爽人人爽人人片| 91成人福利视频| 亚洲免费视频二区| 麻豆精品国产传媒mv男同| 99精品国产热久久91蜜凸| 亚洲乱码国产乱码精品精的特点| 日本高清免费不卡视频| 亚洲欧美在线磁力| 欧美最猛性xxxxx(亚洲精品)| 国产98在线|日韩| 欧美午夜性视频| 催眠调教后宫乱淫校园| 国产盗摄一区二区三区在线| 国产又粗又猛又爽| 国产一区二区不卡| 一区二区三区91| 日韩高清a**址| 欧美一级黄色网| 欧美日韩一区综合| 日韩高清第一页| 久久久久久久久久久久久久久久久| 日韩中文字幕综合| 欧美激情在线一区二区| 在线观看一区二区精品视频| 欧美成人午夜影院| 天堂一区二区三区| 自拍视频一区二区| 在线免费观看一区二区| 粉嫩嫩av羞羞动漫久久久| 日本丰满少妇一区二区三区| 日韩中文理论片| 精品国产乱码久久久久久丨区2区| 黄在线观看网站| 日本在线一级片| 五月天婷婷在线观看| 成人免费在线观看入口| 日韩精品亚洲元码| 99久久精品久久久久久ai换脸| 久久久999免费视频| 日本a级片视频| 另类人妖一区二区av| 婷婷国产在线综合| 97热在线精品视频在线观看| 日韩经典在线视频| 中文字幕在线播放视频| 亚洲精品第五页| 亚洲精品第一国产综合野| 中日韩午夜理伦电影免费 | 精品视频全国免费看| 午夜精品国产精品大乳美女| 2021国产视频| 26uuu成人网| 国产a视频精品免费观看| 欧美一区中文字幕| 99精品国产一区二区| 色黄视频免费看| japanese国产| 天天色综合天天| 欧美一级免费视频| 香蕉视频禁止18| 国产国语亲子伦亲子| 亚洲午夜激情av| 日本国产欧美一区二区三区| 久久久久免费精品| 国产情侣小视频| 亚洲精品免费一二三区| 777午夜精品福利在线观看| 丰满人妻中伦妇伦精品app| 波多野结衣视频网址| 亚洲人精品午夜| 55夜色66夜色国产精品视频| 亚洲狼人综合干| 亚洲欧美高清视频| 精品视频1区2区3区| 激情伦成人综合小说| 国产美女高潮视频| 国产日韩三级在线| 欧美激情女人20p| 亚洲欧美在线精品| 好吊色在线观看| 日韩欧美国产一区二区在线播放| 欧美性大战久久久久| 婷婷色中文字幕| 国产精品电影院| 国产精品pans私拍| 一道本在线观看| 99免费精品视频| 欧美激情视频一区二区| 在线免费观看视频黄| 久久午夜精品| 亚洲网在线观看| 国产亚洲欧美在线视频| 免费观看a视频| 亚洲精品720p| 18禁免费观看网站| 日韩av中文在线观看| 日韩风俗一区 二区| 黄色三级中文字幕| 日韩性xxxx| 亚洲欧美一区二区三区情侣bbw | 国产午夜激情视频| 一区二区三区在线播| 国产高清一区二区三区| 免费一级肉体全黄毛片| 亚洲一区二区三区不卡国产欧美| 成人欧美一区二区| 日本天堂网在线观看| 欧美性生交xxxxx久久久| 久久免费一区| 97免费观看视频| 亚洲国产毛片完整版| 亚洲人成无码www久久久| 国产一区二区免费看| 日韩综合中文字幕| 国产精品jizz| 亚洲视频一区在线| 久久久综合亚洲91久久98| 精品国产www| 亚洲成avwww人| 亚洲免费一级视频| zzijzzij亚洲日本少妇熟睡| 国产精品久久久久久亚洲调教| 伊人在线视频观看| 在线观看日产精品| 日本免费不卡一区二区| 国产乱子伦视频一区二区三区| 国语自产精品视频在线看| 成人精品999| 欧美性xxxx| www.一区二区.com| 看片网站在线观看| 91精品综合久久久久久| 在线观看免费污视频| 国产精品美女久久久久久2018| 成人av免费在线看| 韩国av在线免费观看| 欧美黑人狂野猛交老妇| 性少妇xx生活| 欧美日韩精品电影| 看看黄色一级片| 亚洲三级电影网站| 国产又大又长又粗又黄| 精品一区二区三区蜜桃| 国产精品视频区| 亚洲天堂网视频| 久久99久国产精品黄毛片入口| 久久人妻无码aⅴ毛片a片app | 国产无码精品久久久| 国产欧美日韩亚州综合| 亚洲欧美日韩中文视频| 精品久久sese| 午夜剧场成人观在线视频免费观看| 国产精品成人aaaaa网站| 日韩精品视频久久| www.com欧美| 日本成人免费在线| 亚洲最大的黄色网址| 在线播放中文一区| 国产毛片久久久久久| 午夜视频一区在线观看| 欧美精品色婷婷五月综合| 国产三区在线成人av| 亚洲国产精品一区二区第一页| 国产精品一区在线观看你懂的| 国产成人av一区二区三区| 日韩高清不卡一区二区三区| 国产精品人成电影在线观看| 欧性猛交ⅹxxx乱大交| 国产欧美日韩精品丝袜高跟鞋| 国产精品伦一区二区三区| 欧美激情一区二区三区在线视频观看 | 99麻豆久久久国产精品免费优播| 欧美日韩精品久久久免费观看| 国产福利91精品一区二区三区| 夜夜嗨av色综合久久久综合网| 久久久久综合网| 91精品人妻一区二区三区蜜桃2| 精品国产乱码久久久久久天美| 久久久久麻豆v国产精华液好用吗| 一二三四社区欧美黄| 中文字幕在线成人| 免费av中文字幕| 亚洲一区二区久久| 中文字幕色一区二区| 欧美手机在线观看| 国产视频综合在线| 9999热视频| 久久久精品黄色| 翔田千里亚洲一二三区| 亚洲天堂福利av| av免费播放网站| 欧美丝袜丝交足nylons图片| 妺妺窝人体色www在线观看| 久久久精品tv| wwwxxx黄色片| 亚洲成人在线观看视频| 激情内射人妻1区2区3区| 五月天丁香久久| 最新中文字幕视频| 在线播放国产一区二区三区| 亚洲一区 中文字幕| 国产精品久久精品视| 久久久777精品电影网影网| www日韩在线观看| 欧美精品久久久久久久多人混战| 国产成人福利在线| 国语自产精品视频在免费| 日本欧美一区二区| 日本阿v视频在线观看| 欧美日韩亚洲综合| 日韩精品一区不卡| 精品久久久久久一区二区里番| 国产精品免费av| 亚洲做受高潮无遮挡| 久久99久久99精品免观看粉嫩 | 一区二区久久精品| 亚洲精品国产精品国自产观看浪潮| 成人精品在线看| 91免费版黄色| 亚洲精品v日韩精品| 1024手机在线观看你懂的| 性欧美xxxx| 国产福利精品一区| 香蕉视频xxxx| 久久中文字幕在线视频| 狠狠色丁香婷婷综合| 可以免费在线看黄的网站| 精品精品国产高清a毛片牛牛| 在线播放精品视频| 国产精品视频yy9099| 中文字幕一区二区三区精华液| 日本人dh亚洲人ⅹxx| 一区二区国产盗摄色噜噜| 水蜜桃av无码| 国产精品视频精品| 精品久久久久久中文字幕一区奶水 | 国产91视频一区| 欧美巨大另类极品videosbest | 国产婷婷97碰碰久久人人蜜臀 | 亚洲性生活大片| 亚洲免费视频一区| 欧美性色19p| 少妇久久久久久被弄高潮| 亚洲综合在线小说| 亚洲一区二区av在线| 在线观看日韩中文字幕| 久久久久se| 777久久久精品| 性做久久久久久久久久| 97视频久久久| 久久精品成人一区二区三区| 波多野结衣视频一区| 91中文字幕永久在线| 国产成人精品视频在线| 成人免费在线视频观看| 欧美日韩在线视频免费播放| 欧美色欧美亚洲另类七区| 欧洲视频一区二区| 欧美 日韩 综合| 国产一级片黄色| 韩国欧美亚洲国产| 国产色产综合产在线视频 | 亚洲第一天堂av| 毛片av一区二区| 舐め犯し波多野结衣在线观看| 91久久久精品| 欧美性色综合网| 久久久噜噜噜久久狠狠50岁| 中文字幕欧美日韩va免费视频| 综合电影一区二区三区 | 男人av资源站| 久久久久久91| 欧美性猛交xxxx乱大交极品| 成人在线一区二区三区| 天堂中文在线看| 亚洲 国产 日韩 欧美| 国产麻豆天美果冻无码视频| 欧美交换配乱吟粗大25p| 欧美精品精品精品精品免费| 精品国产一区久久| 国产91精品久久久久久久网曝门| 国产乱码久久久久| 国产精品久久久久久免费观看| 日韩一区二区免费在线观看| 激情综合色综合久久| 欧美成人久久久免费播放| 欧美大香线蕉线伊人久久| 亚洲小视频在线观看| 中文字幕av资源一区| 伊人网视频在线| 免费看的av网站| 久久精品国产综合精品| 中文字幕亚洲综合| 亚洲一区二区3| 精品写真视频在线观看 | 色综合手机在线| 国产自摸综合网| 亚洲精品wwww| 日韩毛片一二三区| 日韩一级片免费观看| 国产尤物在线播放| 免费在线一区二区| 不卡毛片在线看| 91高清视频免费看| 91免费观看国产| 午夜精品久久久久久久99| 国精产品一区一区| 欧美亚洲国产成人| 国产欧美日韩综合一区在线观看| 亚洲欧美激情一区| 色综合色综合色综合色综合色综合| 国产精品夜夜爽| 国产男女无套免费网站| 国产成人精品视频免费| 久久撸在线视频| 亚洲视频小说| 成人xvideos免费视频| 一区二区三区在线播放欧美| 在线免费观看视频一区| 国产免费久久精品| 久久精品网址| 波多野结衣爱爱| 69xxx免费| 五月六月丁香婷婷| 无码人妻精品一区二区蜜桃色欲| 国产美女www爽爽爽视频| 免费国产精品视频| 人人干人人干人人干| 午夜av免费在线观看| 欧美日韩国产专区| 欧美在线观看网址综合| 久久久久久久久久久久久久久久久久av | 成人在线精品视频| 亚洲国产精品毛片| 一区二区三区国产免费| 国产精品20p|