我应该只在免费商店上为一次调用创建对象吗?
Should I create object on a free store only for one call?
假设代码位于块if
,那么在免费存储中创建对象和只对其执行一次调用有什么区别:
auto a = aFactory.createA();
int result = a->foo(5);
并直接在返回的指针上调用?
int result = aFactory.createA()->foo(5);
性能有什么不同吗?哪种方式更好?
#include <iostream>
#include <memory>
class A
{
public:
int foo(int a){return a+3;}
};
class AFactory
{
public:
std::unique_ptr<A> createA(){return std::make_unique<A>();}
};
int main()
{
AFactory aFactory;
bool condition = true;
if(condition)
{
auto a = aFactory.createA();
int result = a->foo(5);
}
}
看这里。即使禁用了优化,为两个版本生成的代码也没有区别。
将 gcc7.1 与-std=c++1z -O0
一起使用
auto a = aFactory.createA();
int result = a->foo(5);
编译为:
lea rax, [rbp-24]
lea rdx, [rbp-9]
mov rsi, rdx
mov rdi, rax
call AFactory::createA()
lea rax, [rbp-24]
mov rdi, rax
call std::unique_ptr<A, std::default_delete<A> >::operator->() const
mov esi, 5
mov rdi, rax
call A::foo(int)
mov DWORD PTR [rbp-8], eax
lea rax, [rbp-24]
mov rdi, rax
call std::unique_ptr<A, std::default_delete<A> >::~unique_ptr()
并int result = aFactory.createA()->foo(5);
:
lea rax, [rbp-16]
lea rdx, [rbp-17]
mov rsi, rdx
mov rdi, rax
call AFactory::createA()
lea rax, [rbp-16]
mov rdi, rax
call std::unique_ptr<A, std::default_delete<A> >::operator->() const
mov esi, 5
mov rdi, rax
call A::foo(int)
mov DWORD PTR [rbp-8], eax
lea rax, [rbp-16]
mov rdi, rax
call std::unique_ptr<A, std::default_delete<A> >::~unique_ptr()
所以它们几乎是相同的。
当您意识到两个版本之间的唯一区别是,在第一个版本中,我们将名称分配给我们的对象,而在第二个版本中,我们使用未命名的版本时,这种结果是可以理解的。除此之外,它们都是在堆上创建的,并以相同的方式使用。由于变量名对编译器没有任何意义 - 它只与代码阅读器相关 - 它将两者视为相同。
在您的简单情况下,它不会有什么区别,因为(main(函数在创建和使用a
后立即结束。
如果接下来再多几行代码,则a
对象的销毁将发生在main
if
块的末尾,而在一行的情况下,它将在该单行的末尾被销毁。但是,如果更复杂的class A
的析构函数会对此产生影响,那将是糟糕的设计。
由于编译器优化,性能问题应始终通过在具体代码上使用探查器进行测试来回答。
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 什么是仅调用一次并调用参数的控制台应用
- 谷歌基准测试,如何只调用一次代码?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- 在可变函数调用中执行一次语句
- 我应该只在免费商店上为一次调用创建对象吗?
- 如果初始化需要shared_from_this,如何在一次调用中构建一个类
- GoogleMock:如何保存参数,以便在模拟上的下一次调用中使用
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- C++ 向量元素被最后一次调用push_back替换
- 在一次调用C++11中启动多个线程
- opengl/glut 中的 renderDisplayFunc 不止一次调用 myfunc
- 为什么popn()一次又一次调用返回相同的输出
- 如何只对move构造函数进行一次调用?
- 通过一次调用c++将整个二进制文件读取到一个数组中
- 在一次调用中重置使用 iomanip 所做的所有更改的类:setprecision、setfill 和标志
- 圆函数:一次调用绘制多个圆