【发布时间】:2014-09-05 15:53:06
【问题描述】:
我将代码简化为问题的根源:
//==============================================================================
// PRE-DEFINITIONS
#define GIVE_ME_ODD_BEHAVIOUR true
//==============================================================================
// INCLUDES
#include <iostream>
//==============================================================================
// TYPES
//------------------------------------------------------------------------------
template<typename T> struct X {
T data;
X() : data(0)
{ std::cout << "X construction @ " << this << std::endl; }
template<typename TT>
X(const X<TT> & other) : data(other.data)
{ std::cout << "X construction @ " << this << " from " << &other << std::endl; }
~X()
{ std::cout << "X destruction @ " << this << std::endl; }
template<typename TT>
void Copy(const X<TT> & other)
{ std::cout << "X copy @ " << this << " from " << &other << std::endl; }
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template<typename T>
X<double> XConversion(const X<T> & other)
{
#if GIVE_ME_ODD_BEHAVIOUR
return X<double>(other);
#else
X<double> d;
d.Copy(other);
return d;
#endif
}
//==============================================================================
// MAIN
int main()
{
X<double> d;
X<int> i;
std::cout << std::endl;
d = XConversion(i);
std::cout << std::endl;
d = XConversion(d); // !!!
std::cout << std::endl;
return 0;
}
其中,与
GIVE_ME_ODD_BEHAVIOUR true
给出输出:
X construction @ 0x23aa70
X construction @ 0x23aa60
X construction @ 0x23aa80 from 0x23aa60
X destruction @ 0x23aa80
X destruction @ 0x23aa90 // never created !!!
X destruction @ 0x23aa60
X destruction @ 0x23aa70
它似乎类似于THIS 问题,但我确实定义了 ctor。我在这里看到了复制省略优化点,但是:
- 为什么编译器会破坏它优化出来但从未创建的对象?
- 我怎样才能确保它不会发生?
附加信息:
我试过gcc 4.8.1和C++ Builder XE3,优化关闭,调试编译,结果一样。
我试图删除模板性,如
struct X {
double data
...
X(const X &)
...
};
但结果相同。
解决此问题的一种方法是,例如,将 cctor 设为私有并仅公开 Copy 方法。但这会阻止我(任何人)甚至从函数中返回对象......
背景:
我有一组互为好友且可转换的模板类。这些类共享相同的数据,但通过部分专业化以不同的方式操作它们。实例可以根据需要对数据进行软拷贝或原始拷贝。如果他们进行软拷贝,则引用计数器会增加。随着实际从未创建的实例的额外删除,引用计数器在没有事先增加的情况下减少。
【问题讨论】:
-
@AdrianoRepetti 他没有复制构造函数。
标签: c++ constructor destructor compiler-optimization