std :: move是否对堆栈变量有意义

哈里

我需要创建一个大小为1024的结构列表。因此,我试图通过使用移动语义来优化对列表的推入操作。但是移动语义仅对堆分配的内存有意义(据我所知)。有人可以建议我这样做的更好方法。这是我的代码

#include <iostream>
#include <list>
    
struct St {
    int32_t arr[1024];
};
    
int main() {
    std::list<St> struct_list;
    for(int32_t i = 0; i < 1024; ++i) {
        St st; // stack allocated and memory gets deallocated after each loop
        std::cout << &st << std::endl;
        struct_list.emplace_back(std::move(st)); // I feel std::move doesn't make any sense here even if I implement move constructor, still data gets copied into the std::list which is allocated in heap, so not efficient.
        std::cout << &struct_list.back() << "\n" << std::endl;
    }
        
    return EXIT_SUCCESS;
}
罗威

根据您当前的定义St

struct St {
    int32_t arr[1024];
};

从技术上讲,对于的特定定义,移动和复制两个结果都是相同的St

但是,从语义上讲,st在完成操作时标记为移动确实有意义,并且st无论如何都会被破坏。例如,如果您以后决定将的定义更改为以下内容St

struct St {
    std::vector<int32_t> vec;
};

然后,这将有所作为–向量数据成员将被移动而不是被复制。

简而言之,我的建议是集中于移动操作语义-即,移动对象是否有意义?好吧,如果您仍然要处理该对象,那么很有可能会这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

它是否有意义的JdbcTemplate与CrudRepository混?

有一个不使用实例变量的非静态方法是否有意义?

覆盖接口中的方法是否有意义

Java模式:何时使用临时变量有意义

自检Java中的null是否有意义

尝试节省内存是否有意义?

我必须将大多数变量定为最终值是否有意义?

在C ++ 17中使用const std :: string&参数是否有意义?

函数中的静态constexpr变量有意义吗?

在Spring的JdbcTemplate中使用PersistenceExceptionTranslationPostProcessor是否有意义?

对所有永不更改的变量使用const是否有意义?

空的“ else”子句在C ++中是否有意义?

GADT标头中的类型变量有意义吗?

对于以std :: thread和std :: mutex为字段的类,move构造函数是否有意义?

std :: vector.push_back(std :: move(foo))是否有意义?

sizeof(function)是否有意义?

AMP启用桌面站点是否有意义?

嵌套setState是否有意义?

在C ++中,使用带有std :: optional <T>参数的函数来表示可选参数是否有意义?

寻找其他可能的方式来检查变量是否有意义

寻找其他可能的方式来检查变量是否有意义

这是通用参考吗?std :: forward在这里有意义吗?

将变量定义为受特征保护是否有意义?

与两个向量和线性搜索相比,std :: map在什么时候对对象进行分组更有意义?

抛出总是被链接的异常是否有意义?

是否存在使用 NOT LIKE ANY 有意义的场景?

为 python 变量打字是否有意义,因为它们不会捕获错误?

为私有变量设置这个公共是否有意义?

使用具有相同条件变量的不同互斥体是否有意义?