我有以下两个类:
template <size_t size>
class Cont{
public:
char charArray[size];
};
template <size_t size>
class ArrayToUse{
public:
Cont<size> container;
inline ArrayToUse(const Cont<size+1> & input):container(reinterpret_cast<const Cont<size> &>(input)){}
};我在全局范围内有以下三行代码:
const Cont<12> container={"hello world"};
ArrayToUse<11> temp(container);
char (&charArray)[11]=temp.container.charArray;在我的全部代码中,“容器”对象的唯一用法是初始化"ArrayToUse“类的对象,在初始化"charArray”对"temp.container.charArray“的引用后,我将在代码的其余部分使用该引用,现在我想知道编译器是否为”容器“对象保留内存,因为它有一个临时用途?
发布于 2010-10-20 03:52:50
在全局作用域定义的任何变量在编译时都有为其保留的内存。这并不意味着可以保证它被正确初始化,但它仍然存在。
在链接时,Visual C++提供了strip unused data and functions via /OPT选项-请参阅此处。
发布于 2010-10-20 03:52:48
这完全取决于你的特定编译器,所以我会说检查程序集并找出答案!编译器可以优化容器,也可以忽略这一点。
发布于 2010-10-20 04:05:25
编译器应该在编译的目标文件中创建container变量。链接器是可以判断是否需要它的链接器(对于exported符号,或者如果声明为extern,则从另一个编译单元)。
但是..。
类型Cont<x>与Cont<x+1>无关。您不能依赖以类似方式布局的成员变量的内存。见鬼,你甚至不知道它看起来是不是一样,因为有一个叫做“模板专门化”的东西:
// your code
template <size_t size>
class Cont{
public:
char charArray[size];
};
// my evil tweak
// I'm the worst compiler ever but I feel that this
// array would better be represented as a map...
template<> class Cont<12> {
std::map<int,char> charArray;
};
// your screwed up result
Cont<12> c12;
Cont<11>& c11( reinterpret_cast<Cont<11>&>(c12) );
char (&s11)[11] = c11.charArray; // points to the first byte of a list object...编辑-- @UncleBen的评论暗示我在这里做得太多了。他是对的。
根据wikipedia的说法,
所以在这种情况下,
析构函数,其中析构函数是析构函数的第一个成员,没有非POD members
Cont<n>运算符,也没有析构函数它是安全的。
https://stackoverflow.com/questions/3972109
复制相似问题