WIl*_*JBD 3 c++ optimization performance pointers reference
以下面的功能为例
string print()
{
return (some string that has been formed);
};
Run Code Online (Sandbox Code Playgroud)
现在让我们说这个打印函数将形成一个可笑的大字符串,需要返回到从另一个类调用它的函数.
现在说这个打印功能可能会被调用数千次.有没有正确和快速的方法来做到这一点?
在Visual Studio中,您可以执行此操作
void print(string& lines)
{
lines = (some string that has been formed);
};
Run Code Online (Sandbox Code Playgroud)
但是g ++不会编译它,也不应该这样做,因为这可能是一个临时对象,可能在任何时候消失.所以根据我的理解,我可以做到这一点
void print(const string& lines)
{
};
Run Code Online (Sandbox Code Playgroud)
如果我想要的只是在这个字符串中检索一些东西,而不是修改它并快速完成.但我确实想修改它.所以我不能这样做.
这引出了我的问题是声明一个指向对象的新指针将成为最快的方法吗?还是慢一点?或者它是不值得的.即(不确定这是否会起作用?)
void print(string* lines)
{
string formedString; // the string that has been formed
lines = formedString&;
};
Run Code Online (Sandbox Code Playgroud)
最后,如果我在运行时加载对象,并通过以下方式将它们添加到树中:
void add(const ItemType& item)
{
someNode->item = item;
};
Run Code Online (Sandbox Code Playgroud)
在item
最初的函数调用该范围的临时存储的对象add()
,因此将其分配到节点导致调用函数的栈呆在身边不再那么想?或者这样可以吗?我以后能够编辑item
,还是现在被卡住了?
只是学习头脑的问题:)
只需返回字符串即可完成.
编译器将使用返回值优化(或命名返回值优化)来消除返回时字符串的额外副本.一个真正新的编译器也将有一个移动构造函数和移动赋值运算符std::string
,这将为完成相同的事情提供更大的保证.
编辑(抱歉,我最初错过了最后一个问题):在该函数返回后,赋值不会保留函数的任何局部值.函数返回时,将销毁其所有局部变量.如果您将该函数的值分配给它返回后持续的值,那就没有问题 - 它将被复制(或可能移动)到目标.如果保留指向该局部的指针或引用,则在函数返回后它将悬空,因此尝试使用引用或取消引用指针将导致UB.
根据情况,后者可能是您想要使用a的情况shared_ptr
,因此函数和外部代码都将共享对数据的访问,并且只有在销毁了对它的两个引用时才会销毁数据.