当前位置: 首页 > 知识库问答 >
问题:

为什么std::互换有这么多专业?

云慈
2023-03-14

在查看std::swap的文档时,我看到了许多专门化<看起来每个STL容器以及许多其他std设施都有专门的交换<我想借助模板,我们不需要所有这些专门化?

例如,
如果我编写自己的对,它可以正确地与模板版本配合使用:

template<class T1,class T2> 
struct my_pair{
    T1 t1;
    T2 t2;
};

int main() {
    my_pair<int,char> x{1,'a'};
    my_pair<int,char> y{2,'b'};
    std::swap(x,y);
} 

那么,从专业化std::pair中获得了什么呢?

template< class T1, class T2 >
void swap( pair<T1,T2>& lhs, pair<T1,T2>& rhs );

我还想知道我是否应该为自定义类编写自己的专门化,
还是仅仅依赖模板版本。


共有3个答案

司空俊雄
2023-03-14

这大概是出于性能原因,因为所包含的类型交换起来很便宜,但复制起来很昂贵,比如向量。由于它可以在第一次和第二次调用swap,而不是使用临时对象进行复制,因此可以显著提高程序性能。

白子明
2023-03-14

std::交换是按照下面的代码实现的:

template<typename T> void swap(T& t1, T& t2) {
    T temp = std::move(t1); 
    t1 = std::move(t2);
    t2 = std::move(temp);
}

(有关更多信息,请参阅“标准库如何实现std::交换?”。)

那么,从专业化std::pair中获得了什么呢?

std::交换可以通过以下方式进行专门化(简化自libc):

void swap(pair& p) noexcept(is_nothrow_swappable<first_type>{} &&
                            is_nothrow_swappable<second_type>{})
{
    using std::swap;
    swap(first,  p.first);
    swap(second, p.second);
}

如您所见,使用ADL直接在对的元素上调用交换:这允许在first第二上使用交换自定义且可能更快的实现(这些实现可以利用元素内部结构的知识来提高性能)。

(请参阅“如何使用std::swap启用ADL?”有关更多信息。)

蓝飞
2023-03-14

那么专攻std::有什么好处呢?

表演通用交换通常足够好(从C 11开始),但很少是最佳的(对于std::pair和大多数其他数据结构)。

我还想知道是应该为自定义类编写自己的专门化,还是仅仅依赖模板版本。

我建议在默认情况下依赖模板,但如果分析显示它是一个瓶颈,那么要知道可能还有改进的空间。过早优化等等。。。

 类似资料:
  • 我需要在向量中找到max元素,所以我使用了,但我发现它是一个非常慢的函数,所以我编写了自己的版本,并设法获得更好的x3性能,下面是代码: 输出: 平均而言,要比多花费x3个时间。那么为什么我能够这么容易地创建一个更快的std函数呢?既然std这么慢,我是不是应该停止使用std并编写自己的函数呢? 注意:一开始我以为这是因为我在for循环中使用了andinteger而不是迭代器,但现在看来这并不重要

  • 在我的clang和libc版本中(靠近),这个传递: 当然,如果你真的试图复制构造一个唯一指针的向量,它无法编译: 我假设这种情况是因为

  • 以上是目前我的CNN的架构。然而,它说它有1.8m可训练的参数。为什么会这样?我以为第一层给出了(32*4=128个参数),但是我如何找到模型的其余部分有多少个参数? 我的理解是,CNN架构应该只依赖于过滤和最大池,因为它们是共享权重。为什么我有这么多参数?我应该如何着手减少这个数字? 我不是问如何使用“汇总”找到参数的数量。我是问为什么我的模型有这么多参数,以及我如何减少这个数字。我不直观地理解

  • 为什么在堆上分配内存,而没有? 它们之间的主要区别是可以重用,而std::latch不能重用,但我找不到解释为什么前者会分配内存。

  • 问题内容: 这是所有编程语言所共有的吗?在进行多次打印后再执行println似乎更快,但是将所有内容移动到字符串中并仅进行打印似乎最快。为什么? 编辑:例如,Java可以在不到一秒钟的时间内找到所有高达100万的质数- 但要进行打印,然后在自己的println中将它们全部输出可能需要几分钟!最多可打印100亿小时! 例如: 问题答案: 速度并不慢,而是由主机操作系统提供的与控制台连接的基础。 您可