C++相談室 part119 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0321デフォルトの名無しさん
2015/09/21(月) 21:37:25.15ID:IzwQBNZR実は俺もそのリンクにしかたどり着けず、長年の疑問を解消できていない。
そのリンク先での内容はスタックの存在を考えていないことが間違いだ。(static変数とstatic関数を混同している)
多分、C言語は仕様にスタックの存在が仮定されていると思う。
ただ、関数自体はそのように動的に生成され、消滅しても良いことに仕様としてはなっている。
(と断言できるほど明確に記述はされていないが)
ただこの場合関数ポインタが使えなくなるため、通常のC/C++では実際には生成/消滅はしない。
結果的にC/C++の場合の静的関数(static void hoge()等)と動的関数(void hoge()等)に大差はない。
だからこそ、静的関数のメリットが分からない。
C++の場合、templateは静的に展開される。
つまり、必要なものを全てコンパイル時に生成し、実行体に埋め込む。
templateは使った分だけきっちりexeが膨らむ。
従って、template等を使い尽くした場合、場合によってはアドレス空間が枯渇する。
(ただし parametar pack の場合だけ別扱いかもしれないが。)
http://en.cppreference.com/w/cpp/language/parameter_pack
>>310
C++/CLIでは関数は動的に配置される。
そのクラスが使用される時にメンバ関数がメモリ上に配置され、不要になれば回収される。
従って原理的には32bitマシンでも4GB以上のexeを動作させられる。(C#も多分同じ)
クラス外部から関数のアドレスを参照する場合は static である必要がある。
これは実行時に仮想関数等のアドレステーブルに配置できることを保証するため。
つまり、staticを付けるかどうかは明確に違いがある。
分かりやすくいえば、
・4GB以上のexeを32bitマシンで実行できるか?(データではなく、命令部分だけで4GB以上)
となる。C++/CLI、C#は出来る。Javaも多分出来る。
C/C++は多分できない。(動的関数ならできる)
■ このスレッドは過去ログ倉庫に格納されています