热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用std::valarray替换PODC风格的数组是个坏主意吗?

如何解决《用std::valarray替换PODC风格的数组是个坏主意吗?》经验,为你挑选了3个好方法。

我正在使用编写得很糟糕的代码库并且有很多内存泄漏.

它使用了许多包含原始指针的结构,这些结构主要用作动态数组.

尽管结构通常在函数之间传递,但是这些指针的分配和释放被放置在随机位置,并且不容易被跟踪/推理/理解.

我将其中的一些更改为类,并将这些指针改为由类本身进行RAII.它们运行良好并且看起来不是很难看,除了我禁止复制构造和复制分配这些类只是因为我不想花时间实现它们.

现在我在想,我是在重新发明轮子吗?为什么我不用std:array或std :: valarray替换C风格的数组?

我更喜欢std :: valarray,因为它使用堆内存和RAIIed.并且std :: array在我的开发环境中尚未可用.

Edit1:std :: array的另一个优点是大多数动态数组都是POD(主要是int16_t,int32_t和float)数组,而数字API可以使生活更轻松.

在我开始之前有什么需要注意的吗?

我能想到的是,可能没有一种简单的方法可以将std :: valarray或std :: array转换回C风格的数组,并且我们的部分代码确实使用指针算法并且需要将数据呈现为普通的C风格的数组.

还要别的吗?

编辑2

我最近遇到了这个问题.一个非常糟糕的事情std::valarray是它在C++ 11之前不能安全地复制 - 可分配.

正如在该答案中引用的那样,在C++ 03及更早版本中,如果源和目标具有不同的大小,则为UB.



1> Baum mit Aug..:

C风格阵列的标准替代品将是std::vector.std::valarray是一些"奇怪的"数学向量,用于进行数字计算之类的东西.它并不是真正设计用于存储任意对象的数组.

如此说来,用std::vector是最有可能的一个非常 不错的主意.它可以修复你的泄漏,使用堆,可调整大小,具有很大的异常安全性等等.

它还保证数据存储在一个连续的内存块中.您可以使用data()成员函数获取指向所述块的指针,或者,如果您是C++之前的11,则使用&v[0]非空向量v.然后,您可以像往常一样使用它进行指针业务.


@ user3528438不复制(几乎)总是比复制快,但如果你必须*复制,使用`std :: vector`中高度优化的实现就派上用场了.

2> Yakk - Adam ..:

std::unique_ptr是接近替代的拥有者int*.它有一个很好的属性,它不会隐式复制自己,但它会隐式移动.

复制操作将生成编译时错误,而不是运行时效率低下.

int*除了在销毁时进行空检查之外,它还具有除了拥有之外的任何运行时开销.它不使用空间int*.

std::vector 存储3个指针并隐式复制(这可能很昂贵,并且与您现有的代码行为不匹配).

我会从std::unique_ptr第一关开始,让它工作.std::vector在我决定智能缓冲管理是值得的之后,我可能会将一些代码转换为.

其实,第一遍,我会寻找memcpymemset以及类似功能,并确保有问题,他们没有在结构工作开始之前,我将RAII成员.

A std::unique_ptr表示结构的默认创建析构函数将为您执行RAII清理,而无需编写任何新代码.


@ user3528438是的.`memset`要清除,'memcpy`要复制等等 - 所有这些都是C风格代码中常见的微优化,并且会对RAII类(在实践中)和未定义的行为(理论上)造成致命的破坏.

3> masoud..:

我更喜欢std::vector作为c风格数组的替代品.您可以通过以下方式直接访问基础数据(类似裸指针).data():

返回指向用作元素存储的基础数组的指针.


推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
fjkfjaslfjsal_577
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有