あなたは単純すぎるクラスを書きました。このアドバイス:
実行可能ファイルを gdb にロードしたら、break (または b) と入力して、Tab キーを押します。
一般的には正しいですが、あなたの場合、MinGWはMyClass用に何も作成しません. プログラムを MinGW でコンパイルし、逆アセンブルしました。
(gdb) disassemble /m main
Dump of assembler code for function main(int, char**):
13 {
0x0040138c <+0>: push %ebp
0x0040138d <+1>: mov %esp,%ebp
0x0040138f <+3>: and $0xfffffff0,%esp
0x00401392 <+6>: sub $0x10,%esp
0x00401395 <+9>: call 0x40193c <__main>
14 MyClass a;
15 MyClass b = a;
0x0040139a <+14>: mov 0xc(%esp),%eax
0x0040139e <+18>: mov %eax,0x8(%esp)
16 MyClass c;
17 c = a;
0x004013a2 <+22>: mov 0xc(%esp),%eax
0x004013a6 <+26>: mov %eax,0x4(%esp)
18 return 0;
0x004013aa <+30>: mov $0x0,%eax
19 }
0x004013af <+35>: leave
0x004013b0 <+36>: ret
End of assembler dump.
ご覧のとおり、移動命令のみです。たとえば、代入のc = a;
結果は 2 つの移動命令だけになり、関数呼び出しはありません。
0x004013a2 <+22>: mov 0xc(%esp),%eax
0x004013a6 <+26>: mov %eax,0x4(%esp)
ご覧のとおり、コンパイラはクラスに対して何も生成しないことを選択しました。私の意見では、あなたはあまりにも単純な例を選んで、あなたが望むことを学ぶことができませんでした.
例をもう少し複雑にしました
#include <iostream>
class MyClass
{
public:
void Hello()
{
std::cout << "Hello\n";
}
int a;
};
int main(int argc, char **argv)
{
MyClass a;
a.Hello();
MyClass b = a;
MyClass c;
c = a;
return 0;
}
とgdb
ブレークの下で私はこれを示しています:
(gdb) b MyClass
MyClass MyClass::Hello()
(gdb) b MyClass
これはnmの出力です:
D:\src-c++\test.names>nm -C ./m.exe | grep MyClass
00404060 r .eh_frame$_ZN7MyClass5HelloEv
00401c20 t .text$_ZN7MyClass5HelloEv
00401c20 T MyClass::Hello()
クラスによって生成されたデフォルト関数が何であるかを見たかっただけです。それを書いていない場合
メンバー クラス変数を 'int a' から std::string a に変更すると、コンパイラによって生成された既定の関数が表示されます。
#include <iostream>
#include <string>
class MyClass
{
public:
void Hello() {
}
std::string a;
};
int main(int argc, char **argv)
{
MyClass a;
MyClass b = a;
MyClass c;
c = a;
return 0;
}
そして、これらはコンパイルで生成された関数です:
>nm -C ./a.out | grep My
00000000004009b8 W MyClass::MyClass(MyClass const&)
0000000000400964 W MyClass::MyClass()
000000000040097c W MyClass::~MyClass()
0000000000400994 W MyClass::operator=(MyClass const&)