gpt4 book ai didi

C++ 结构初始化

转载 作者:行者123 更新时间:2023-11-30 03:35:09 27 4
gpt4 key购买 nike

我在 somecode.h 中有以下结构声明:

    struct MySt
{
MySt( const char * m, const char * gm ):
firstSen(m),
secondSen(gm)
{
}

std::string firstSen;
std::string secondSen;
};

这是 somecode.cpp 中的代码:

        std::vector<MySt> dataSen;

char * cp = trim(buff);
std::vector<std::string> tokens;

getTokens( cp, tokens );

if(tokens.size() == 2 )
{

dataSen.push_back( MySt(tokens[0].c_str(), tokens[1].c_str() ));
}

此代码有效。我的问题是:这种MySt初始化,是栈还是堆,是动态分配还是静态分配?谢谢。

最佳答案

这里发生了很多事情。

dataSen 是一个 vector ,这意味着它在堆栈上有少量空间来存储指向其存储的指针以及一些开销内容(如大小等),但它存储的所有内容通过它管理的分配在堆上。

std::string,dataSen 存储的类型,实际上有少量数据存储在您的 vector 中(同样,在堆上),然后创建它的堆分配拥有它的数据。 (可以进行一个小的字符串优化,但这超出了本文的范围)。

因此,您将内容读入标记 vector ,该 vector 将数据存储为字符串。字符串的存储在堆上(通过 vector 的堆分配),实际字符在字符串中的存储(通过由字符串管理的堆分配)也是如此。

然后您使用 c_str() 从每个字符串中获取一个 const char* 引用来创建一个临时的 MySt(它创建了两个新字符串,由常量字符*)。然后将这个临时文件复制到 vector 中,这意味着它存储在由 vector 管理的堆上,每个字符串数据通过由字符串管理的不同分配存储在堆上。

现在...这些可能都不是真的,因为优化器可以做很多技巧,但这正是您要求完成的。

巧合的是,如果你使用 emplace_back(const char*, const char*) 而不是 push_back(MySt(...)) 你会在适当的地方构造它制作一个临时的和移动的。

此外,如果您为 MySt 添加了一个采用 std::string&& 值的构造函数,您可以将已经创建的字符串移动到 MySt 中以避免转换为 const char* 然后从中创建另一个字符串。

编辑您的评论:

struct MySt
{
// existing constructor, creating strings from const char*
MySt( const char * m, const char * gm ):
firstSen(m),
secondSen(gm)
{
}

// constructor copying string inputs
MySt( const std::string& m, const std::string& gm) :
firstSen(m),
secondSen(gm)
{
}

// constructor moving existing strings (strings from calling code
// will be in an unusable state other than to re-assign them to
// something new... but it will take the allocated heap from the
// existing strings as to avoid making another heap allocation)
MySt( std::string&& m, std::string&& gm) :
firstSen(std::move(m)),
secondSen(std::move(gm))
{
}

std::string firstSen;
std::string secondSen;
};

然后使用...

getTokens( cp, tokens );

if(tokens.size() == 2 )
{
// to copy...
dataSen.emplace_back( tokens[0], tokens[1] );

// or to move...
dataSen.emplace_back( std::move(tokens[0]), std::move(tokens[1]) );
}

关于C++ 结构初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41467795/

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