2011-02-08 84 views
0

繼續從Absolute fastest (and hopefully elegant) way to return a certain char buffer given a struct type我想現在每個結構初始化每個靜態字符buf單獨。初始化靜態初始化的每個結構字符緩衝區的最佳方法是什麼?

以IE:

#pragma pack(push, 1); 

struct Header { 
    int a; 
    int b; 
    char c; 
}; 

struct X { 
    int x; 
    int y; 
}; 

struct Y { 
    char someStr[20]; 
}; 

struct Msg { 
    Header hdr; 
    union { 
     X x; 
     Y y; 
    }; 
}; 

#pragma pack(pop) 

我們:

tempate<typename T> 
struct Buffer { 
    static char buffer[sizeof(T)]; 
} 

template<class T> 
inline char* get_buffer() { 
    return Buffer<T>::buffer; 
} 

的兩件事情,我所尋找的是:

  1. 正好有2個緩衝區:1 X一個用於Y.它們應該分別是sizeof(Msg.hdr)+ sizeof(Msg.x)和sizeof(Msg.hdr)+ sizeof(Msg.y)的長度。
  2. 在應用程序生命週期中,每個緩衝區都將被檢索很多,並且只有一些字段真的(或需要)被更改。 2a。由它的char緩衝區支持的X的Msg應該初始化爲m.hdr.a = 1,m.hdr.b = 0;對於消息Y,它應該是m.hdr.a = 16; m.hdr.b = 1;舉個例子。
  3. 該應用程序將頻繁地將這些緩衝區作爲由X或Y支持的類型Msg(應用程序知道哪一個),然後僅更改x和y或someStr,然後將其輸出到文件中,例如重複。

只是想知道在@ 6502和@Fred Nurk這些優秀的例子上建立這些優秀的例子以優雅地初始化這兩個緩衝區,同時又是人類可讀的。我希望繼續使用結構並儘可能限制reinterpret_cast的使用,因爲可能會出現別名問題。

請讓我知道,如果我不清楚,我會盡我所能回答任何問題和/或編輯這個問題的描述。

謝謝。

***更新:我的這些緩衝區的使用模式是,我將發送將char * out複製到流或文件。因此我需要獲取指向底層數據的char *指針。不過,我需要通過結構來處理char緩衝區,以提高可讀性和方便性。此外,這個字符緩衝區應該是解耦的,並且不一定包含或「附加」到結構中,因爲結構幾乎在單獨的文件中,並且在其他不需要/需要緩衝區的地方使用。只是做一個簡單的靜態X X;靜態Y y;足夠或可能更好的緩衝區長度X的Msg緩衝區的頭+ X?然後以某種方式只保留一個char *引用到X和Y的每個Msg?我會遇到別名問題嗎?

+6

您真的*需要專注於使用簡單,良好的編碼實踐和乾淨,易用的類型來編寫程序。然後,只有這樣 - 如果速度不夠快 - 您應該對其進行分析以找出哪些行爲實際上使其過於緩慢。擔心所有事物的走樣是非常不成熟的。通過與工會打交道,重新解釋強制轉換和未對齊的字符緩衝區,您可以通過未對齊的數據和未定義的行爲來進行災難處理,這些字符緩衝區最適合作爲目標惡意來處理已處理好的數據流中的*實際問題。 – 2011-02-08 04:50:31

回答

1

如果你想用C編寫它,你可以看看一個相當常見的C編譯器擴展,稱爲「強制轉換爲聯合類型」,但在C++中它不再存在。

在C++中,沒有辦法繞過reinterpret_cast <>來滿足你的要求,但至少你可以通過計算成爲聯合體的NULL指針上的成員偏移量,然後從你的數據指針中減去這個偏移量然後投入工會。我相信大部分編譯器的偏移量都是0,但最好保證安全。

template<class T> 
union Aligner { 
    T t; 
    char buffer[sizeof(T)]; 
}; 

template<class T> 
inline char* get_buffer(T* pt) { 

    return reinterpret_cast<Aligner<T>*>(reinterpret_cast<char*>(pt) - reinterpret_cast<ptrdiff_t>(&reinterpret_cast<Aligner<T>*>(NULL)->t))->buffer; 
}