Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器会为此对象保留内存吗?_C++_Class_Memory_Compiler Construction - Fatal编程技术网

C++ 编译器会为此对象保留内存吗?

C++ 编译器会为此对象保留内存吗?,c++,class,memory,compiler-construction,C++,Class,Memory,Compiler Construction,我有以下两门课: 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_c

我有以下两门课:

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)){}
};
模板
类Cont{
公众:
字符字符[大小];
};
模板
类阵列用途{
公众:
集装箱;
内联数组使用(const Cont&input):容器(reinterpret_cast(input)){}
};
我在全局范围内有以下三行代码:

const Cont<12> container={"hello world"};
ArrayToUse<11> temp(container);
char (&charArray)[11]=temp.container.charArray;
const Cont container={“hello world”};
阵列使用温度(容器);
char(&charArray)[11]=temp.container.charArray;

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

它完全取决于您的特定编译器,所以我建议检查程序集并找出答案!
编译器可以优化容器输出,也可以忽略此操作。

在全局范围中定义的任何变量在编译时都为其保留了内存。这并不意味着它保证被正确初始化,但它仍然存在

链接时,VisualC++提供了选项-参见此处。

< P>编译器应该在编译的目标文件中创建容器< /C>变量。链接器可以判断是否需要它(对于
导出
ed符号,或者从另一个编译单元(如果声明为
外部

但是

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

// 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...
//您的代码
模板
类Cont{
公众:
字符字符[大小];
};
//我的恶作剧
//我是最差的编译器,但我觉得
//数组最好表示为一个映射。。。
模板类Cont{
地图特征;
};
//你搞砸了的结果
Cont c12;
Cont&c11(重新解释铸件(c12));
char(&s11)[11]=c11.charArray;//指向列表对象的第一个字节。。。
编辑--@UncleBen的评论暗示我在这里做得过火了。他是对的

根据,

  • 指向POD结构的指针 对象,使用 重新解释演员阵容,指向其 初始成员,反之亦然, 这意味着在这个位置没有填充 POD结构的开始
所以在这种情况下,

  • 其中
    charArray
    Cont
    的第一个成员,不存在非POD成员

  • 没有赋值运算符,也没有析构函数


它是安全的。

@flownt-它可以为我编译。是的,经过仔细检查,它还可以,但语法看起来相当神秘。在任何情况下,引用都不是指向容器,而是指向arraytouse中的子对象,因此容器仍可能被优化。@Steve Townsend\我不是使用charArray引用“container”对象,而是引用“temp.container.charArray”。@flownt-编译器无法优化它。这就是问题所在,如果你想讨论链接时间优化,那就另当别论了。@Steve-关于vtables,好吧1)它们是全局的,2)这是链接时间优化。otoh我让gcc用lto在O3生成代码,我甚至在第一行添加了static,所以它知道这可能是唯一使用它的地方,而且它仍然拒绝优化它,因此我假设编译器(还)不够聪明,无法编译掉它,或者标准不允许这样的事情(也许标准发现它是可以观察到的)…在得到更多的Youk之前,也许你想在这上面写一张你想达到的东西……呃……这件事。帮助C++ NooBee出来,这到底是怎么回事?“梦梦:让人们说:”我自己也不太确定。我不想努力去理解这些代码的基本原理。但它基本上是一个
Cont
(你可以把它看作
char[12]
),另一个类(
ArrayToUse
),它有一个
Cont
(或
char[11]
),通过
重新解释
cast
(那里的大wtf),用一个
Cont
)来构造一个
Cont
(或
char
)字符,然后生成一个引用
char[11]的变量
并将其绑定到
阵列使用
的内部阵列。我不知道任何一点背后的要点。我认为我的C++技能向后退一步试图理解这一点。除非有专门化,编译器是否真的对该类如何在内存中进行设置(第一成员的偏移量为0,数组是连续的)。