gpt4 book ai didi

c++ - 传递大物体的最快方法

转载 作者:太空狗 更新时间:2023-10-29 19:53:17 25 4
gpt4 key购买 nike

以下面的函数为例

string print()
{
return (some string that has been formed);
};

现在假设这个打印函数将形成一个大得离谱的字符串,它需要返回到从另一个类调用它的函数。

现在说这个打印函数可能会被调用上千次。是否有正确且更快的方法来执行此操作?

在 Visual Studio 中你可以这样做

void print(string& lines)
{
lines = (some string that has been formed);
};

但是 g++ 不会编译它,也不应该这样做,因为它可能是一个随时可能消失的临时对象。所以据我所知,我可以做到这一点

void print(const string& lines)
{
};

如果我只想检索此字符串中的某些内容而无需修改它,并且可以非常快速地完成。但我确实想修改它。所以我不能这样做。

这让我想到了一个问题,即声明一个指向对象的新指针将是执行此操作的最快方法?还是更慢?或者只是不值得。即(不确定这是否有效?)

void print(string* lines)
{
string formedString; // the string that has been formed
lines = formedString&;
};

最后,如果我在运行时加载对象,并通过以下方式将它们添加到树中:

void add(const ItemType& item)
{
someNode->item = item;
};

item本来是调用这个add()的函数作用域中的临时存储对象,所以将它赋值给节点会导致调用的栈功能可以停留更长的时间然后想要吗?或者这样可以吗?另外,我以后是否可以编辑 item,或者它现在是否作为常量卡住了?

只是学习头脑的问题:)

最佳答案

只需返回字符串即可。

编译器将使用返回值优化(或命名返回值优化)来消除返回字符串时的额外拷贝。真正新的编译器还将为 std::string 提供移动构造函数和移动赋值运算符,这将为完成同样的事情提供更大的保证。

编辑(抱歉,我最初错过了最后一个问题):分配一个值将不会在函数返回后保留函数的任何局部内容。当一个函数返回时,它的所有局部变量被销毁。如果您从该函数分配一个 给它返回后持续存在的东西,那没问题——它会被复制(或可能移动)到目的地。如果您保留指向该局部的指针或引用,它将在函数返回后悬空,因此尝试使用该引用或取消引用该指针将导致 UB。

根据情况,后者可能是您想要使用shared_ptr 的情况,因此函数和外部代码都将共享对数据的访问, 只有当对它的两个引用都被销毁时,数据才会被销毁。

关于c++ - 传递大物体的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15673179/

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