この質問は、構造体オフセットを使用したポインタ演算を使用して派生したポインタに関するものです。C++での構造体オフセットとポインタの安全性
は、次のプログラムを考えてみましょう:
は#include <cstddef>
#include <iostream>
#include <new>
struct A {
float a;
double b;
int c;
};
static constexpr auto off_c = offsetof(A, c);
int main() {
A * a = new A{0.0f, 0.0, 5};
char * a_storage = reinterpret_cast<char *>(a);
int * c = reinterpret_cast<int *>(a_storage + off_c));
std::cout << *c << std::endl;
delete a;
}
このプログラムは、デフォルトの設定とC++ 11標準を使用して、仕事と私がテストしたコンパイラに期待される結果を与えることが表示されます。
(代わりにreinterpret_cast
の私たちが代わりにchar *
とstatic_cast
のvoid *
を使用し、密接に関連するプログラム、 は普遍的に認められていない。gcc 5.4
がvoidポインタとポインタ演算に関する警告を発行し、clang 6.0
はvoid *
とポインタ 算術演算であることを言いますエラー)
このプログラムは、C++標準に従って明確に定義された動作をしていますか?
回答は、実装がリラックスしているか厳密なポインタの安全性([basic.stc.dynamic.safety]
)を持っているかによって異なりますか?
これは宿題ですか? –
@ GarrGodfrey:私は驚いています... –
なぜC++のメンバ機能へのポインタを使用してください。これは 'offsetof'の「クリーンな」代替手段ですか? –