ExerciseC++読書会 vol.2
https://scrapbox.io/files/6983353470707df9ae4835e5.png
開催日時
2026年3月10日(火) 19:30~21:00
開催URL
参加人数
5人
ウォーミングアップ
パズル3
解答は最適化なし
クラッシュするときのアセンブリ言語(最適化あり、clang, x86_64)
code: cpp
main:
push rax
mov edx, 11
call std::basic_ostream<char, std::char_traits<char>>& std::__ostream_insert<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*, long)@PLT
.L.str:
.asciz "did task 1\n"
popもなければretもない
Task2をコメントアウトした時のアセンブリ言語
code: cpp
main:
push rax
mov edx, 11
call std::basic_ostream<char, std::char_traits<char>>& std::__ostream_insert<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*, long)@PLT
xor eax, eax
pop rcx
ret
.L.str:
.asciz "did task 1\n"
パズル4 グローバルに挑戦
絶妙な設問
この話の流れだとこれも未初期化かとミスリードさせる
ディスクからメモリに置いた
この時点で初期化になっている
.bss
ゼロ初期化されるグローバル変数が並んでいる
グローバル変数を10個作って0, 1, 0, 1...で初期化してみると変数の並びが変わるはず
0を連続したメモリに配置したいから0で初期化した変数が連続する
昔、複数のグローバル変数がメモリ的に連続すること前提のコードを見かけたことがある
block starting symbolの略
パズル5
ボーナス問題
Buttonのデストラクタにoverride指定があるのでコンパイルエラーになる
overrideも書かれていないとして
Buttonのデストラクタが呼ばれない
EffectiveC++から代々伝わる啓蒙内容
じゃあ暗黙的にvirtualを付けてくれたらいいのに
そもそもunique_ptr<Button>だったら基底にvirtual書いてなくてもきちんと両方のデストラクタが呼ばれる
draw関数がないとしたら必要ないのにvtableが作られてしまう
vtableを抑制したいときはあえてvirtualをつけない
もったいないおじさん激怒
それJavaの仕様 > 暗黙的virtual
込み入った事情 > std::tupleの実装
ポリモーフィックではないけれど継承が必要
パズル6
次回ここから
お悩み雑談室