Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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++ 变化 您希望向量中的某些元素是“空的”(可以用空指针表示),而在向量中按值存储虚拟的、未使用的Bar实例是不实际的_C++_Heap Memory_Stack Memory_Heap Fragmentation - Fatal编程技术网

C++ 变化 您希望向量中的某些元素是“空的”(可以用空指针表示),而在向量中按值存储虚拟的、未使用的Bar实例是不实际的

C++ 变化 您希望向量中的某些元素是“空的”(可以用空指针表示),而在向量中按值存储虚拟的、未使用的Bar实例是不实际的,c++,heap-memory,stack-memory,heap-fragmentation,C++,Heap Memory,Stack Memory,Heap Fragmentation,如果您确实需要指针,我强烈建议使用智能指针 在其他情况下,您应该更喜欢按值存储对象,因为它通常更有效。在以下情况下使用指针向量: Bar是一个基类,您希望在向量中存储派生类的实例 Bar没有合适的复制/移动构造函数,或者成本过高 您希望将指向向量中对象的指针存储在其他位置,并且可以更改向量的容量(例如,由于调整大小或向后推)。如果对象是按值存储的,当容量发生变化时,旧指针将变得无效 您希望向量中的某些元素是“空的”(可以用空指针表示),而在向量中按值存储虚拟的、未使用的Bar实例是不实际的

如果您确实需要指针,我强烈建议使用智能指针


在其他情况下,您应该更喜欢按值存储对象,因为它通常更有效。

在以下情况下使用指针向量:

  • Bar是一个基类,您希望在向量中存储派生类的实例
  • Bar没有合适的复制/移动构造函数,或者成本过高
  • 您希望将指向向量中对象的指针存储在其他位置,并且可以更改向量的容量(例如,由于调整大小或向后推)。如果对象是按值存储的,当容量发生变化时,旧指针将变得无效
  • 您希望向量中的某些元素是“空的”(可以用空指针表示),而在向量中按值存储虚拟的、未使用的Bar实例是不实际的
如果您确实需要指针,我强烈建议使用智能指针



在其他情况下,您应该更喜欢按值存储对象,因为这样通常效率更高。

如果不需要指针,就不要使用指针。我正在尝试避免堆碎片。但我也不想冒堆栈溢出的风险。一般来说,避免使用指针可能更好,但我可以有很多条。一个详细的答案和解释可以帮助我更好地理解我的选项。我很确定,这个向量将为堆上的“条”分配空间。所以,如果你有std::vector,这并不意味着“条”的空间将在堆栈上分配。堆栈与这些有什么关系?我不知道堆栈溢出的危险是如何产生的。如果我使用new创建一个条,那么它将位于堆上。但是如果我使用bar=bar(),那么它将在堆栈上。如果不需要指针,就不要使用指针。我正在尝试避免堆碎片。但我也不想冒堆栈溢出的风险。一般来说,避免使用指针可能更好,但我可以有很多条。一个详细的答案和解释可以帮助我更好地理解我的选项。我很确定,这个向量将为堆上的“条”分配空间。所以,如果你有std::vector,这并不意味着“条”的空间将在堆栈上分配。堆栈与这些有什么关系?我不知道堆栈溢出的危险是如何产生的。如果我使用new创建一个条,那么它将位于堆上。但是如果我做bar=bar(),那么它将在堆栈上。那么堆栈溢出呢?我如何知道堆栈上的空间是否用完了?
std::vector
使用
new
分配空间,所以除了容器占用的几十个字节之外,它不会使用堆栈,所以你很好。@John:为什么堆栈溢出会出现这种情况?无论哪种方式,您都只有一个
向量
,并且
向量
具有固定大小,而不管它们包含什么。向量被实现为指向一个可用存储内存区域的一组指针。我想我很困惑,因为我想在向量中存储“bar”而不是“bar*”。顺便问一下,你说的是什么缓存?堆栈溢出呢?我如何知道堆栈上的空间是否用完了?
std::vector
使用
new
分配空间,所以除了容器占用的几十个字节之外,它不会使用堆栈,所以你很好。@John:为什么堆栈溢出会出现这种情况?无论哪种方式,您都只有一个
向量
,并且
向量
具有固定大小,而不管它们包含什么。向量被实现为指向一个可用存储内存区域的一组指针。我想我很困惑,因为我想在向量中存储“bar”而不是“bar*”。顺便问一下,你在说什么缓存?如果你有更多关于stl容器性能的资料,请分享@Zsolt,我想说我有一份清单,但我并没有保留一份。另一个链接是我很抱歉,但我不明白-这与堆碎片有什么关系?@John,单独分配对象可能会导致碎片,因为您无法控制它们的分配位置。当
向量
分配一个连续的内存块时,对象将在内存中彼此相邻地排列(带有一些保留)。这使主机和运行时有更好的机会避免碎片。@John,正确;此外,如果您能够使用C++11语言功能,并启用移动
,则只需将其移动到容器中即可。如果您有更多关于stl容器性能的源,请共享@Zsolt,我想说我有一份清单,但我并没有保留一份。另一个链接是我很抱歉,但我不明白-这与堆碎片有什么关系?@John,单独分配对象可能会导致碎片,因为您无法控制它们的分配位置。当
向量
分配一个连续的内存块时,对象将在内存中彼此相邻地排列(带有一些保留)。这使主机和运行时有更好的机会避免碎片。@John,正确;此外,如果您能够使用C++11语言功能,并启用移动
,它将做得更好,只需将其移动到容器中即可。
class foo{
public:
std::vector<bar>; // Or I can have std::vector<bar*>
};