在查看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 );
我还想知道我是否应该为自定义类编写自己的专门化,
还是仅仅依赖模板版本。
这大概是出于性能原因,因为所包含的类型交换起来很便宜,但复制起来很昂贵,比如向量。由于它可以在第一次和第二次调用swap,而不是使用临时对象进行复制,因此可以显著提高程序性能。
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?”有关更多信息。)
那么专攻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亿小时! 例如: 问题答案: 速度并不慢,而是由主机操作系统提供的与控制台连接的基础。 您可