首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器会为这个对象预留内存吗?

编译器会为这个对象预留内存吗?
EN

Stack Overflow用户
提问于 2010-10-20 03:45:45
回答 3查看 215关注 0票数 0

我有以下两个类:

代码语言:javascript
复制
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)){}
};

我在全局范围内有以下三行代码:

代码语言:javascript
复制
const Cont<12> container={"hello world"};
ArrayToUse<11> temp(container);
char (&charArray)[11]=temp.container.charArray;

在我的全部代码中,“容器”对象的唯一用法是初始化"ArrayToUse“类的对象,在初始化"charArray”对"temp.container.charArray“的引用后,我将在代码的其余部分使用该引用,现在我想知道编译器是否为”容器“对象保留内存,因为它有一个临时用途?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-20 03:52:50

在全局作用域定义的任何变量在编译时都有为其保留的内存。这并不意味着可以保证它被正确初始化,但它仍然存在。

在链接时,Visual C++提供了strip unused data and functions via /OPT选项-请参阅此处。

票数 2
EN

Stack Overflow用户

发布于 2010-10-20 03:52:48

这完全取决于你的特定编译器,所以我会说检查程序集并找出答案!编译器可以优化容器,也可以忽略这一点。

票数 0
EN

Stack Overflow用户

发布于 2010-10-20 04:05:25

编译器应该在编译的目标文件中创建container变量。链接器是可以判断是否需要它的链接器(对于exported符号,或者如果声明为extern,则从另一个编译单元)。

但是..。

类型Cont<x>Cont<x+1>无关。您不能依赖以类似方式布局的成员变量的内存。见鬼,你甚至不知道它看起来是不是一样,因为有一个叫做“模板专门化”的东西:

代码语言:javascript
复制
// 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-struct对象的指针,使用重新解释转换进行适当转换,指向其初始成员,反之亦然,表示POD-struct的开头没有填充。

所以在这种情况下,

析构函数,其中析构函数是析构函数的第一个成员,没有非POD members

  • there is no Cont<n>运算符,也没有析构函数

它是安全的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3972109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档