z****e 发帖数: 2024 | 1 class refc{
public:
refc():cnt(1){cout<<"refc ctr: "<
refc(const refc& x):cnt(x.cnt){++cnt;cout<<"refc cp-ctr: "<
refc& operator=(const refc& x){
cnt=x.cnt;
++cnt;
cout<<"refc op= "<
return *this;
}
~refc(){--cnt;
cout<<"refc dtr "<
}
void nul(){}
private:
int cnt;
};
refc f10(){
refc k;
cout<<"k exist()"<
return k;
}
int main(int argc, char* argv[ ]){
refc x=f10();
}
》
refc ctr: 1
k exist()
refc dtr |
k*****2 发帖数: 252 | 2 你用的是g++吧
VC2008的输出就不一样:
refc ctr: 1
k exist()
refc cp-ctr: 2
refc dtr 0
refc dtr 1 |
S**I 发帖数: 15689 | 3 do you know the difference between:
int a=1;
and
int a;
a=1;
【在 z****e 的大作中提到】 : class refc{ : public: : refc():cnt(1){cout<<"refc ctr: "<: refc(const refc& x):cnt(x.cnt){++cnt;cout<<"refc cp-ctr: "<: refc& operator=(const refc& x){ : cnt=x.cnt; : ++cnt; : cout<<"refc op= "<: return *this; : }
|
k*****2 发帖数: 252 | 4 楼主难道想要问的不是copy ctor?而是op=
【在 S**I 的大作中提到】 : do you know the difference between: : int a=1; : and : int a; : a=1;
|
S**I 发帖数: 15689 | 5 guess you run it under debug mode? try running it under release mode.
【在 k*****2 的大作中提到】 : 你用的是g++吧 : VC2008的输出就不一样: : refc ctr: 1 : k exist() : refc cp-ctr: 2 : refc dtr 0 : refc dtr 1
|
S**I 发帖数: 15689 | 6 isn't his question "why x is initialized without constructor being called?"
【在 k*****2 的大作中提到】 : 楼主难道想要问的不是copy ctor?而是op=
|
k*****2 发帖数: 252 | 7 refc x=f10();
这句难道不是x的构造函数是调用copy ctor?
called?"
【在 S**I 的大作中提到】 : isn't his question "why x is initialized without constructor being called?"
|
z****e 发帖数: 2024 | 8 对,我用的是g++,这句话好像没有调用关于x的任何构造函数。
觉得可能是compiler的优化设计。
【在 k*****2 的大作中提到】 : refc x=f10(); : 这句难道不是x的构造函数是调用copy ctor? : : called?"
|
z****e 发帖数: 2024 | 9 没有啊,我用的是一般g++默认模式。
【在 S**I 的大作中提到】 : guess you run it under debug mode? try running it under release mode.
|
S**I 发帖数: 15689 | 10 this is for VC2008
【在 z****e 的大作中提到】 : 没有啊,我用的是一般g++默认模式。
|
|
|
S**I 发帖数: 15689 | 11 应该是这样了,对比一下VS下面的debug和release mode的输出结果就看得出来。
【在 z****e 的大作中提到】 : 对,我用的是g++,这句话好像没有调用关于x的任何构造函数。 : 觉得可能是compiler的优化设计。
|
X****r 发帖数: 3557 | 12 The result of f10 is directly constructed on x, i.e. k and
x are at the same location. This optimization is allowed by
the standard. An example can be found in 12.2 [class.temporary]
(2).
"<
【在 z****e 的大作中提到】 : class refc{ : public: : refc():cnt(1){cout<<"refc ctr: "<: refc(const refc& x):cnt(x.cnt){++cnt;cout<<"refc cp-ctr: "<: refc& operator=(const refc& x){ : cnt=x.cnt; : ++cnt; : cout<<"refc op= "<: return *this; : }
|
z****e 发帖数: 2024 | 13 多谢。我没用vc,但是明白你的意思。
【在 S**I 的大作中提到】 : 应该是这样了,对比一下VS下面的debug和release mode的输出结果就看得出来。
|
z****e 发帖数: 2024 | 14 原来如比。
【在 X****r 的大作中提到】 : The result of f10 is directly constructed on x, i.e. k and : x are at the same location. This optimization is allowed by : the standard. An example can be found in 12.2 [class.temporary] : (2). : : "<
|
D****A 发帖数: 360 | 15 I hate C++. so many subtleties ...
This might be so called return value optimization
what about change the return type of f10() to refc&
【在 z****e 的大作中提到】 : class refc{ : public: : refc():cnt(1){cout<<"refc ctr: "<: refc(const refc& x):cnt(x.cnt){++cnt;cout<<"refc cp-ctr: "<: refc& operator=(const refc& x){ : cnt=x.cnt; : ++cnt; : cout<<"refc op= "<: return *this; : }
|
v*s 发帖数: 946 | 16 同意你的话。 C++是越用越害怕。
【在 D****A 的大作中提到】 : I hate C++. so many subtleties ... : This might be so called return value optimization : what about change the return type of f10() to refc&
|
p***o 发帖数: 1252 | 17 But his code violated the semantics of the copy ctor first ...
【在 D****A 的大作中提到】 : I hate C++. so many subtleties ... : This might be so called return value optimization : what about change the return type of f10() to refc&
|
z****e 发帖数: 2024 | 18 请给说说。
怎么回事?
这个太重要了。
【在 p***o 的大作中提到】 : But his code violated the semantics of the copy ctor first ...
|
p***o 发帖数: 1252 | 19 也就是说既然x从k用copy ctor得来,为什么在k的生命期结束的时候
x不能直接把k拿来用呢?如果不能,那就说明你在copy ctor里做了一
些不该做的事情,以至于x和k的内部状态不一样。
【在 z****e 的大作中提到】 : 请给说说。 : 怎么回事? : 这个太重要了。
|
D****A 发帖数: 360 | 20
我晕了。。。。。
【在 D****A 的大作中提到】 : I hate C++. so many subtleties ... : This might be so called return value optimization : what about change the return type of f10() to refc&
|
|
|
D****A 发帖数: 360 | 21 exactly. 这种情况不算复制构造,因为是原始构造。
;; Function refc f10() (_Z3f10v)
refc f10() ()
{
struct refc & k.101;
struct basic_ostream > & D.29480;
struct refc & k.102;
{
struct refc k;
(void) 0;
k.101 = ;
__comp_ctor (k.101);
try
{
D.29480 = operator<< (&cout, &"k exist()"[0]);
operator<< (D.29480, endl);
return ;
}
catch
{
k.102 = ;
__comp_dtor (k.102);
}
}
}
【在 X****r 的大作中提到】 : The result of f10 is directly constructed on x, i.e. k and : x are at the same location. This optimization is allowed by : the standard. An example can be found in 12.2 [class.temporary] : (2). : : "<
|
c*r 发帖数: 278 | 22 Copy ctor shall only create a COPY of an existing object
【在 z****e 的大作中提到】 : 请给说说。 : 怎么回事? : 这个太重要了。
|
B*****t 发帖数: 335 | 23 请教一下这段代码有两个object被构造k和x, 但在G++里面为什么只调用了一个
dtor,看了一下汇编代码,只有x被的dtor被调用了,k的dtor为什么没有被调用?
而且refc x=f10();这句并没有调用copy ctor。why?
refc f10(){
refc k;
cout<<"k exist()"<
return k;
}
int main(int argc, char* argv[ ]){
refc x=f10();
}
[class.temporary]
【在 X****r 的大作中提到】 : The result of f10 is directly constructed on x, i.e. k and : x are at the same location. This optimization is allowed by : the standard. An example can be found in 12.2 [class.temporary] : (2). : : "<
|
X****r 发帖数: 3557 | 24 不是一直就在说这个吗?编译器把x和k优化成同一个对象了,这个优化是C++允许的。
【在 B*****t 的大作中提到】 : 请教一下这段代码有两个object被构造k和x, 但在G++里面为什么只调用了一个 : dtor,看了一下汇编代码,只有x被的dtor被调用了,k的dtor为什么没有被调用? : 而且refc x=f10();这句并没有调用copy ctor。why? : refc f10(){ : refc k; : cout<<"k exist()"<: return k; : } : int main(int argc, char* argv[ ]){ : refc x=f10();
|
a*****i 发帖数: 268 | 25 我理解这里面有两个优化:
1.k和f10()返回值共用空间
2.k和x共用空间
第一个优化很普遍,第二个优化比较不普遍。VC里面debug模式作第一个不做第二个。
【在 B*****t 的大作中提到】 : 请教一下这段代码有两个object被构造k和x, 但在G++里面为什么只调用了一个 : dtor,看了一下汇编代码,只有x被的dtor被调用了,k的dtor为什么没有被调用? : 而且refc x=f10();这句并没有调用copy ctor。why? : refc f10(){ : refc k; : cout<<"k exist()"<: return k; : } : int main(int argc, char* argv[ ]){ : refc x=f10();
|
B*****t 发帖数: 335 | 26 thanks。
研究了一下汇编代码,终于明白了k和x指向同一块内存空间,这块空间实在main函数的
stack中分配的而不是f10. 以前以为是在f10中分配的,怎么想也觉得这个优化有问题。
【在 X****r 的大作中提到】 : 不是一直就在说这个吗?编译器把x和k优化成同一个对象了,这个优化是C++允许的。
|
T*****9 发帖数: 2484 | 27 I hate C++ too...
【在 v*s 的大作中提到】 : 同意你的话。 C++是越用越害怕。
|