gpt4 book ai didi

c++ - 未提供拷贝时使用不安全 move 调整 std::vector 大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:06 26 4
gpt4 key购买 nike

我创建了一个类来封装 OpenGL 纹理的一些功能,我的要求非常简单,所以我只需要能够控制纹理数据和类型。我的类(class)如下(简化):

class Texture
{
std::vector<unsigned char> _data;
[...]
public:
Texture(std::vector<unsigned char> data, vec2 size, GLint internal_format, GLenum format, GLenum type);
Texture(const Texture& other)
{
//copies the data and creates a new buffer with OpenGL
}
Texture(Texture&& other) noexcept
{
//moves the data, copies the buffer id and set the old buffer id to 0
}
}

现在我有另一个类使用 std::vector 管理一些纹理,为了使我的大部分内存管理自动化我意识到我不需要在堆中分配这些纹理,所以 vector 类型是std::vector<Texture> .问题是,当我向 vector 添加新纹理时,它正在复制而不是 move 。我找到了两个解决方案,如果删除复制构造函数/赋值运算符,std::vector 会 move 。但在某些情况下我需要复制。我也可以只保留 vector ,因为我知道我将保留多少纹理。这两种解决方案的问题是我不知道我可能遇到的其他情况,我希望 move 语义能够正常工作。

我读了其他other关于这个问题的答案,但使用 noexcept没有解决问题,正如我所说,如果删除复制构造函数,将选择 move 构造函数。即使我删除了 noexcept并从中扔出一些东西。它是否正确?如果没有可用的复制构造函数,编译器是否应该使用不安全的 move 构造函数?另外,为什么编译器不选择我提供的安全 move 构造函数?

(我使用的是 GCC 4.7)

[编辑]

我举了个例子:http://liveworkspace.org/code/4bzSMD 6美元并意识到如果我保留默认析构函数,则将使用 move 构造函数,但如果我提供析构函数,则它会复制。这是为什么?

最佳答案

我仍然不知道如果没有提供复制构造函数,GCC 为什么选择不安全的 move 构造函数,但 move 问题来自 GCC 4.7 上的显式析构函数,默认情况下不是 noexcept(true),所以当有可用的拷贝时,编译器会认为它更安全(因为复制不会破坏元素。)

更多信息请点击此处 What is the criteria that the compiler uses to decide if a move operation is safe?

关于c++ - 未提供拷贝时使用不安全 move 调整 std::vector 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14848066/

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