にゃははー

はへらー

構造体がどうしてこうなった

例えばメンバをもたない構造体ってサイズを考えたとき、普通0だとか思うよね。俺もそうだったし、少なくともCだと0だった。(仕様として)

#include <stdio.h>

struct hoge {};

int main( void )
{
    return !printf( "%d\n", sizeof( struct hoge ) );
}

ってコードをgccとかに食わせるともちろん0と表示される。

しかしC++では仕様として1が帰ってくる。g++に通してもらえれば分かるだろう。いろいろ調べると参照したときにインスタンスが存在しないと困るとか困らないとか。
よーわからんけど勝手に納得してみると、C++で新しく導入された参照って概念は表面的に値渡しだけど、内部的にはポインタを渡して間接参照するようになってるはず。このときにインスタンスが1バイトでもないと、ポインタの指す先に別のオブジェクトが存在する可能性があるのではいないかとか。
もしコンパイラの最適化でサイズ0のオブジェクトが全部nullptrを指すようになってるとか。
実際にコンパイラ書いてるわけじゃ無いから結局のところよーわからん勝手な想像です。

でも、ふと思うとこの仕様の食い違い問題じゃね?と。つまり、Cで書かれたライブラリのヘッダにメンバなしの構造体があって、そのヘッダをC++に食わせたときどうなるんだと。
ん?でもオブジェクトコードってオブジェクトのアドレスが列挙されてたりするから問題ないのか?いや、配列だとどうなる。次のコードをgccとg++で実行すれば分かるけど、配列もCだと0でC++だと要素数だけバイトを食う。

#include <stdio.h>

struct hoge {};

int main( void )
{
    struct hoge piyo[ 10 ];
    return !printf( "%d\n", sizeof( piyo ) );
}

ということはグローバルな配列をCで定義して、C++で任意要素を参照すると・・・これって脆弱性じゃね?んー謎だ。

まぁメンバ0の構造体を大量に使いまわして何になるかっていうと、C++のテンプレートとかで若干強い静的型付けが出来る程度か・・・実害あんま無さそうだけどどうなんだろうか。
言語屋さん見てたら教えてくれw