【发布时间】:2016-03-26 01:02:07
【问题描述】:
对于T 和U 类型的两个任意对象,它们组合成这样的类
template <class T, class U>
struct Comp
{
T t_m;
U u_m;
};
从(可用的)临时文件中构造它们的最佳(就最小化复制操作而言)方法是什么?
我已经考虑将它们“移”到我的班级中
Comp(T&& t, U&& u)
: t_m(std::move(t))
, u_m(std::move(u))
{ }
但我不知道他们的移动构造函数表现如何或者他们是否有任何东西。
由于我的类似乎可以是一个聚合,我想知道是否删除构造函数并允许 aggregate initialization 会是一个更好的解决方案,即编写如下代码:
Comp{ get_temporary_T(), get_temporary_U() };
或者如果使用direct initialization 有优势。
PS
就地构造(使用placement new 运算符)不是我正在寻找的解决方案。
PS 2
我想std::tuple 使用了这样一种最佳方法,因为make_tuple 显示为通过调用元组构造函数利用临时对象:
auto t = std::make_tuple(10, "Test", 3.14, std::ref(n), n);
或者有人可以详细说明这是如何完成的吗?
【问题讨论】:
-
太宽泛了? “从(可用的)临时文件中构建它们的最佳(就最小化复制操作而言)方法是什么?”太宽泛了?
-
在开始尝试超越编译器的优化器之前,为什么不先测试最简单的代码并开启优化?
-
@PaulMcKenzie 你能帮我解决这个问题吗?您的意思是检查机器代码、速度基准测试、检测我的代码吗?
-
"我想 std::tuple 使用了这样一种最佳方法,因为 make_tuple 显示为通过调用元组构造函数来利用临时对象:" 不清楚你指的是什么在这里,或者
make_tuple的操作方式以任何方式比您的第一个选项更优化。 -
附带说明,您实际上可以检查您的类型是否有移动构造函数:en.cppreference.com/w/cpp/types/is_move_constructible