gpt4 book ai didi

c++ - C++ 中的对象实例化是否存在显着的固有成本?

转载 作者:可可西里 更新时间:2023-11-01 14:57:09 25 4
gpt4 key购买 nike

最近在一次代码审查中(一位年长且更聪明的 C++ 开发人员)告诉我重写我编写的一个类,将它变成一组静态方法。他通过说虽然我的对象确实包含非常少量的内部状态来证明这一点,但它无论如何都可以在运行时派生,如果我改为静态方法,我将避免到处实例化对象的成本。

我现在进行了此更改,但它让我开始思考,在 C++ 中实例化的成本是多少?我知道在托管语言中,垃圾收集对象的所有成本都很重要。但是,我的 C++ 对象只是在堆栈上,它不包含任何虚方法,因此不会有运行时函数查找成本。我使用了新的 C++11 删除机制来删除默认的复制/赋值运算符,因此不涉及复制。它只是一个简单的对象,带有一个只做少量工作的构造函数(静态方法无论如何都需要)和一个什么都不做的析构函数。无论如何可以告诉我这些安装常量是什么吗? (审稿人有点吓人,我不想问他看起来很傻!);-)

最佳答案

简答 - 本质上对象分配很便宜,但在某些情况下可能会变得昂贵。

长答案

在 C++ 中,实例化一个对象的成本与在 C 中实例化一个结构体是一样的。一个对象就是一 block 足够大的内存来存储 v 表(如果它有的话)和所有数据属性.实例化 v 表后,方法不再消耗内存。

非虚拟方法是一个简单的函数,它的第一个参数是隐含的 this。调用虚函数有点复杂,因为它必须查找 v 表才能知道要调用哪个类的哪个函数。

这意味着实例化堆栈上的对象涉及堆栈指针的简单递减(对于完整的递减堆栈)。

当在堆上实例化对象时,成本会大幅上升。但这是任何与堆相关的分配所固有的东西。在堆上分配内存时,堆需要找到一个足够大的空闲 block 来容纳您的对象。找到这样一个 block 是一个非常量时间的操作,而且可能很昂贵。

C++ 的构造函数可以为某些指针数据属性分配更多内存。这些通常是堆分配的。如果所述数据成员自己执行堆分配,情况会更加复杂。这可能会导致涉及大量指令的事情。

所以最重要的是,这取决于您实例化的对象是什么以及如何实例化。

关于c++ - C++ 中的对象实例化是否存在显着的固有成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9490117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com