考虑以下程序,我使用g++ -g myprog.cc
编译。
#include<iostream>
struct Context {
//char *s; // version 1
std::string s; // version 2
};
void f(Context);
void f(Context c) {}
int main(void) {
Context c = Context();
f(c);
}
版本1有char *
成员,而版本2则用std::string
替换它。
使用gdb,我逐步完成代码并获取:
临时断点1,main()at myprog.cc:12
12上下文c =上下文();
&amp; ebsp;缺少单独的debuginfos,请使用:debuginfo-install libgcc-4.4.7-11.el6.x86_64 libstdc ++ - 4.4.7-11.el6.x86_64
(gdb)s
13 f(c);
(gdb)s
f(c = ...)at myprog.cc:9
9 void f(上下文c){}
(gdb)s
main()at myprog.cc:14
14}
这里没有错。
如果我单步执行第2版,我会得到:
临时断点1,main()at myprog.cc:12
12上下文c =上下文();
如果缺少单独的debuginfos,请使用:debuginfo-install libgcc-4.4.7-11.el6.x86_64 libstdc ++ - 4.4.7-11.el6.x86_64
(gdb)s
在myprog.cc:3的Context :: Context(this = 0x7fffffffe400) 3结构语境{
(gdb)s
main()at myprog.cc:13
13 f(c);
(gdb)s
在myprog.cc:3的Context :: Context(this = 0x7fffffffe410) 3结构语境{
(gdb)s
f(c = ...)at myprog.cc:9
9 void f(上下文c){}
(gdb)s
在myprog.cc:3上下文::〜上下文(这= 0x7fffffffe410,__ in_chrg =) 3结构语境{
(gdb)s
在myprog.cc:3上下文::〜上下文(这= 0x7fffffffe400,__ in_chrg =) 3结构语境{
(gdb)s
main()at myprog.cc:14
14}
为什么当我使用Context
成员传递结构std::string
时,我得到输出Context::Context (this=0x7fffffffe400)
?
此外,当我实例化结构时,this=0x7fffffffe400
。当我传入时,this=0x7fffffffe410
。那是为什么?
答案 0 :(得分:0)
您将值c
传递给不执行任何操作的函数。因此编译器必须产生任意值传递的语义效果。编译器不能确定复制然后销毁string
没有后果,所以它做到了。可以肯定的是,复制char *
并销毁副本没有任何后果,所以它不会打扰。
答案 1 :(得分:0)
您正在发生的事情是您看到编译器生成的构造函数,该构造函数不是仅使用指针生成的结构,因为在该构造函数中无需执行任何操作。对于具有std::string
成员的结构,它可能会调用std::string
的构造函数。
由于构造函数是一个非静态成员函数,this=0x7fffffffe400
是隐含的&#39;这个&#39;传入的指针参数。