由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 没有经过构造函数???
相关主题
我这个C++程序有没有什么问题啊?请指点。。。谢谢。。。[C++ boost::interprocess] 讨论贴
C++的一个小疑问,求解惑请教C++问题
A aimple C++ question请教一个c++ throw exception 问题
请问一个exception题目一个C++面试题分析
为什么foo1可以而foo2不行?关于c++的constructor的面试题
菜鸟求教,一个c++的困惑C++菜问: 怎么这样也可以?
一个古怪的C程序运行错误。C++问题
请教这个程序里用到了什么constructor啊?有几个copy constructor?一个指向指针的指针的引用?
相关话题的讨论汇总
话题: refc话题: cnt话题: f10话题: endl话题: cout
进入Programming版参与讨论
1 (共1页)
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++默认模式。
相关主题
菜鸟求教,一个c++的困惑[C++ boost::interprocess] 讨论贴
一个古怪的C程序运行错误。请教C++问题
请教这个程序里用到了什么constructor啊?有几个copy constructor?请教一个c++ throw exception 问题
进入Programming版参与讨论
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&

相关主题
一个C++面试题分析C++问题
关于c++的constructor的面试题一个指向指针的指针的引用?
C++菜问: 怎么这样也可以?c++ singleton questions
进入Programming版参与讨论
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++是越用越害怕。
1 (共1页)
进入Programming版参与讨论
相关主题
一个指向指针的指针的引用?为什么foo1可以而foo2不行?
c++ singleton questions菜鸟求教,一个c++的困惑
reverse words, not the Microsoft one!!!一个古怪的C程序运行错误。
两个继承问题请教这个程序里用到了什么constructor啊?有几个copy constructor?
我这个C++程序有没有什么问题啊?请指点。。。谢谢。。。[C++ boost::interprocess] 讨论贴
C++的一个小疑问,求解惑请教C++问题
A aimple C++ question请教一个c++ throw exception 问题
请问一个exception题目一个C++面试题分析
相关话题的讨论汇总
话题: refc话题: cnt话题: f10话题: endl话题: cout