gpt4 book ai didi

c++ - 标准库容器在 GCC 中生成大量右值拷贝

转载 作者:IT老高 更新时间:2023-10-28 21:41:31 25 4
gpt4 key购买 nike

我正在为 linux 和 windows 编写一个应用程序,并注意到 GCC 构建对复制构造函数产生了很多无用的调用。

这是产生这种行为的示例代码:

struct A
{
A() { std::cout << "default" << std::endl; }
A(A&& rvalue) { std::cout << "move" << std::endl; }
A(const A& lvalue) { std::cout << "copy" << std::endl; }
A& operator =(A a) { std::cout << "assign" << std::endl; return *this; }
};

BOOST_AUTO_TEST_CASE(test_copy_semantics)
{
std::vector<A> vec_a( 3 );
}

这个测试只创建一个包含 3 个元素的 vector 。我期望 3 个默认构造函数调用和 0 个拷贝,因为没有 A 左值。

在 Visual C++ 2010 中,输出为:

default
move
default
move
default
move

在 GCC 4.4.0 (MinGW) 中,(-O2 -std=c++0x),输出为:

default
copy
copy
copy

发生了什么,我该如何解决?实际类(class)的拷贝很昂贵,默认构造和移动很便宜。

最佳答案

两种实现(Visual C++ 2010 和 GCC 4.4.0)都有错误。正确的输出是:

default
default
default

这是在 23.3.5.1 [vector.cons]/4 中指定的:

要求:T 应为 DefaultConstructible。

不允许该实现假定 A 是 MoveConstructible 或 CopyConstructible。

关于c++ - 标准库容器在 GCC 中生成大量右值拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4865515/

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