Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++;将属性转换为指针以减少类的大小是否有缺点?_C++_Class_Pointers - Fatal编程技术网

C++ C++;将属性转换为指针以减少类的大小是否有缺点?

C++ C++;将属性转换为指针以减少类的大小是否有缺点?,c++,class,pointers,C++,Class,Pointers,我在课堂上使用了一个std::vector(16字节)。这将使我的类的大小增加16个字节。作为一个被大量使用的类(也在数组中),我考虑将std::vector替换为std::unique\u ptr,以减小到4字节的大小。那么这样做有什么缺点吗?或者这只是设计内存友好类的一个常见步骤 Edit:我首先考虑这个方法,因为我假设我的类的实例没有构造任何指针。但正如SergeyA谢天谢地指出的那样,std::optional显然是一个更好的选择 编辑2:因为答案是肯定的,所以有缺点,std::opti

我在课堂上使用了一个
std::vector
(16字节)。这将使我的类的大小增加16个字节。作为一个被大量使用的类(也在数组中),我考虑将
std::vector
替换为
std::unique\u ptr
,以减小到4字节的大小。那么这样做有什么缺点吗?或者这只是设计内存友好类的一个常见步骤

Edit:我首先考虑这个方法,因为我假设我的类的实例没有构造任何指针。但正如SergeyA谢天谢地指出的那样,
std::optional
显然是一个更好的选择


编辑2:因为答案是肯定的,所以有缺点,
std::optional
也不完全是我想要的,我觉得我必须进一步澄清(并解释我的实现)。我将把我的问题重新写在纸上。这比我最初预期的要复杂得多。

通过这样做,您将增加应用程序的内存消耗-现在每个对象将使用8个字节作为
唯一的\u ptr
,另外还有16个字节作为向量,分配到动态存储(堆)的其他地方

您还将增加内存碎片,并在访问所述向量时添加额外的间接步骤,从而导致性能下降

但是,如果您具有可选性,即某些对象将具有向量,但某些对象不会,则最好使用专门设计的工具来表达这一点:
std::optional
(C++17之前的编译器中的C++17的一部分或
实验性

正如作者明确指出的,使用
std::unique\u ptr
不会获得任何好处


但是,如果可以在类的多个实例中共享
std::vector
s的内容,则可以使用
std::shared\u ptr

来提高程序的总体内存占用率。如果要节省内存,
std::optional
肯定不是更好的选择。粗略地说,
std::optional
只是
T
bool
标志的集合。因此,无论
std::optional
是否包含值,其大小始终大于
T
的大小(以保持附加的
bool
值)。通常,
sizeof(std::optional)=sizeof(std::vector)+4

引述:

如果
可选
包含值,则该值保证作为可选对象示意图的一部分进行分配,即不会发生动态内存分配。因此,即使定义了
operator*()
operator->()
,可选对象还是对对象建模,而不是指针


<强>加法。<强> >如果代码> T 足够简单(例如,POD),并且您不需要所有的“<代码> STD::向量< /代码>”的设施,考虑使用<代码> STD::UnQuyJPPT .< /P> < P>在一个UngQuyPtR中包裹向量是没有优势的。这是因为向量的内联存储很小,而向量的主存储缓冲区已经是指针,因此很容易移动(只需复制指针)。添加一个唯一的_ptr只会增加另一个间接级别,从而降低访问速度,并可能导致缓存丢失


现在,如果向量是std::array或大型结构,情况就会不同。添加唯一的\u ptr使数组或结构可以移动,而无需执行完全复制,还可以将内存使用从堆栈推送到堆,从而节省宝贵的堆栈空间。

您添加了额外的间接级别,并可能增加了缓存未命中率。但不要删除此级别。否,我会留着的。你为什么要减少班级人数?它必须适合某个地方吗?或者你真的测量过复制它会减慢你的速度吗?另外,你的向量大小是否恒定?在boost库中,你可能会找到最适合你需要的“向量”。也许我认为OP可能在编译32位地址。请记住,
std::vector
不能小于24字节,如果它需要为64位地址维护一个有状态的分配器。但是如果我不构造
unique\u ptr
(以
make\u unique()
的方式),它将不会在堆中分配更多内存,对吗?@ParadobC2如果你想传达这样一个事实,即某些对象根本没有向量,那么,
std::optional
是一个更好的选择。如果
std::vector
是一个成员,那么让它成为
std::optional
有什么意义呢
sizeof(std::可选)
将始终大于
sizeof(std::vector)
。这不是OP想要的。空向量不使用任何内存堆,所以可选向量是一个非常糟糕的选择。不管什么,空向量已经意味着没有元素。