私は最近、D の構造体とクラスに関するこの記事を読んでいて、ある時点で著者が次のようにコメントしています。
...これは構造体の完璧な候補です。その理由は、ALLEGRO_CONFIG へのポインターという 1 つのメンバーしか含まれていないためです。これは、ポインターのサイズにすぎないため、気にせずに値で渡すことができることを意味します。
これは私に考えさせました。本当にそうですか?「無料で」構造体を渡していると信じていると、いくつかの隠れた落とし穴がある可能性がある状況がいくつか考えられます。
次のコードを検討してください。
struct S
{
int* pointer;
}
void doStuff(S ptrStruct)
{
// Some code here
}
int n = 123;
auto s = S(&n);
doStuff(s);
s が doStuff() に渡されるとき、(構造体にラップされた) 単一のポインターが関数に渡されるのは本当にすべてですか? 頭のてっぺんから、構造体の型情報だけでなく、メンバー関数へのポインターも渡されるようです。
もちろん、クラスは常に参照型であるため、これは問題になりませんが、構造体の値渡しセマンティクスは、上記のような余分な「隠し」データが関数に渡されることを示唆していますint への構造体のポインター。これにより、プログラマーは、実際には 8 バイト ポインターと関数への他のいくつかの 8 バイト ポインターを渡しているときに、(64 ビット マシンを想定して) 8 バイト ポインターを渡していると考える可能性があります。さらに、オブジェクトの typeinfo のバイト数です。不注意なプログラマーは、意図したよりもはるかに多くのデータをスタックに割り当てています。
私はここで影を追いかけていますか、それとも単一の参照で構造体を渡し、疑似参照型である構造体を取得していると考えている場合、これは有効な懸念事項ですか? Dには、これを防ぐメカニズムがありますか?