2014-03-28 90 views
3

在C中,我看到offsetof的一些用法來計算結構中成員到其開始處的偏移量?關於C和C++中的offsetof用法?

是否仍推薦在C++中使用?任何其他方式沒有這個宏來做到這一點?

+0

offsetof [可用於C++](http://stackoverflow.com/ a/19943445/1708801),其限制條件是:如果type不是標準佈局類(第9章),則結果是未定義的和將offsetof宏應用於靜態數據字段的結果 成員或一個函數成員是未定義的。「 –

+0

你應該仔細問自己爲什麼你需要「offsetof」宏的功能。它在C++中可用,但它會給非POD結構和類帶來意想不到的結果。如果你不知道什麼是POD,那麼你最好不要在C++代碼中使用它。除非你有很好的理由,否則最好不要在C代碼中使用它。 – gnasher729

+2

爲什麼每個人都不鼓勵它的使用?在計算內聯彙編的偏移量或計算可以改變的POD結構的偏移量(Winternl.h中的WINAPI的TEB結構)時,以及計算x32與x64代碼中的偏移量而不對硬編碼偏移量時,該函數非常有用。 – Brandon

回答

0

Offsetof是一個特點,就是隻爲了與C兼容的C++標準,以便它不reccomended用C字

0

使用我不會推薦它的任何東西,除非你真的需要。只要您的使用在C中有效,它應該對C++有效。不知道你在做什麼,你的問題是不可能回答的。

0

不,不是。

適當的C++風格鼓勵用戶儘可能避免所有低級細節。這是爲了安全/正確性和可讀性。只有當低級操縱能夠保證真實和顯着的性能提高時,才能跳入其中。

0

之一offsetof()的用法是在類C具有代碼結構具有固定報頭和可變大小的數組,像在這個博客帖子解釋:

Why do some structures end with an array of size 1?

(注這個博客文章使用了宏觀的FIELD_OFFSET,這是一個Windows主題,對應於offsetof()。)

我認爲在現代C++中我們應該使用高級技術和代碼,如std::vector可變大小陣列。

1

C++有指向成員的指針。這些類似於偏移量,但(1)類型安全和(2)更通用 - 它們也可以與基類中的方法一起使用等。