gpt4 book ai didi

c++ - std::pair 将 first 和 second 分配给语义命名的变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:50 26 4
gpt4 key购买 nike

有一个非常流行的问题是“std::pair vs struct with two fields”。但我有一个关于将 firstsecond 值重新分配给语义命名变量的问题。在常规情况下,我们有这样的事情:

const std::pair<const int, const int> result = processSomething();
std::cout << result.second << " of " << result.first << std::endl;

但是如果我们先将它们分配给引用变量呢:

const std::pair<const int, const int> result = processSomething();
const int &numTotal = result.first;
const int &numSuccessful = result.second;

std::cout << numSuccessful << " of " << numTotal << std::endl;

这使我们无需编写有关 firstsecond 语义的评论。这种方式有什么缺点?编译器是否会为 numTotalnumSuccessful 保留堆栈?如果在应用程序的主循环中使用这种模式,性能会下降吗?

修复

由常规变量改为引用变量(感谢您的意见)

最佳答案

我没有看到任何严重的缺点,具有有意义名称的变量可以帮助使代码更清晰。一个体面的优化编译器应该能够在简单的情况下(例如您的示例)消除额外引用的任何开销,但对于类型不相同的更复杂的情况(例如,它们具有不同的 const 限定或需要转换)可能不会。

在某些情况下,还有另一种选择可能更清晰:您可以创建所需的变量,然后创建一个,而不是用结果初始化一个对这些变量的引用,并通过引用分配给它们:

int numTotal;
int NumSuccessful;
std::pair<int&, int&> result(numTotal, numSuccessful);
result = processSomething();

或者同样的事情,没有为引用对命名的变量:

int numTotal;
int NumSuccessful;
std::pair<int&, int&>(numTotal, numSuccessful) = processSomething();

或者在 C++11 中,您可以使用标准的 tie 函数:

int numTotal;
int NumSuccessful;
std::tie(numTotal, numSuccessful) = processSomething();

一个更不寻常的解决方案不涉及临时对象,并允许您通过使用具有有意义的成员名称的局部类型来使变量const:

struct Num {
Num(std::pair<const int, const int> p) : total(p.first), successful(p.second) { }
int total;
int sucessful;
};
const Num num = processSomething();
std::cout << num.successful << '/' << num.total << '\n';

关于c++ - std::pair 将 first 和 second 分配给语义命名的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21625788/

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