在书中有效的C++,我看见了下面一段话:C++在空类中编写和调用什么函数?
其结果是,如果你写
class Empty{};
它本质上是一样的,如果你写的:
class Empty { public: Empty() { ... } Empty(const Empty& rhs) { ... } ~Empty() { ... } Empty& operator=(const Empty& rhs) { ... } // copy assignment operator };
以下代码将导致生成每个函数:
Empty e1; Empty e2(e1); e2 = e1;
但拆卸这是由编译上面的代码中创建可执行文件后,我意识到它并非如此:没有被调用的任何功能。
这里是主要的汇编代码:
00000000004006cd <main>:
4006cd: 55 push %rbp
4006ce: 48 89 e5 mov %rsp,%rbp
4006d1: b8 00 00 00 00 mov $0x0,%eax
4006d6: 5d pop %rbp
4006d7: c3 retq
没有在.text
段命名为“空”的任何功能。
那么在我们调用构造函数或空类的赋值后,编译器的行为究竟是什么?这本书是否会产生一些功能?如果是这样,他们在哪里存储?
您是否使用优化进行编译? – Rakete1111
为了迂回,'Empty(){...}'与编译器生成的*不完全相同,要得到与编译器生成的相同的结果,您需要'Empty()= default;'。有微妙的差异 - 其他成员也是如此。看到这里:http://en.cppreference.com/w/cpp/language/default_constructor#Trivial_default_constructor –
没有任何优化 – linvoker