草庐IT

C++ (gcc/g++) 两个巨大的字符串数组需要很长时间才能编译

对于用C++编写的程序,我需要两个包含数据的巨大字符串数组。它们在头文件中定义如下:#includestaticconststringstrdataA[30000]={"thisisthefirstlineofthedata","thesecondlineofdata","otherstuffinthethirdline",下降到"lastline."};//secondarraystringsstaticconststringstrdataB[60000]={"thisisthefirstlineofthedata","thesecondlineofdata","otherstuff

c++ - 在 C++ 中,如果复制一个对象是可能的,但确实很昂贵而且通常不是一个好主意,您是否仍然应该使用复制构造函数来实现复制?

我是C++的新手,我对一些关于复制的C++约定有疑问。我在谷歌上四处搜索,并没有真正找到好的指导,所以我求助于你们这些好人。假设您有一个对象,代表某种技术上可复制的资源,但复制成本很高,而且几乎总是错误的做法。你还应该为它实现一个复制构造函数吗?还是创建一个类似make_copy()的成员函数更好(对于那些您确实想要复制对象的罕见情况)。例如:假设您有一个表示存储在显存中的纹理的类。该资源在技术上是可复制的:您可以为其创建一个新句柄并复制内存(通过CPU或使用图形库调用)。但一般来说,这不是你真正想经常做的事情。它很昂贵,而且通常是错误的做法,并且可能非常浪费内存。但是,您可以想象有意

c++ - qpainter 绘画替代品(在 Mac 上性能很差)

我有一个类在QWidget中显示音频文件的波形数据(请参见下面的小部件的屏幕截图,当时我仍然使用渐变,这导致性能不佳)。使用多次调用QPainter::drawLine直接在widget的paintEvent中绘制音频数据(调用QWidget::drawLine的最小数量是等效的到小部件的宽度=>每个x坐标至少一行)。虽然该方法在Windows上运行良好(全屏paintEvent大约需要4毫秒),但当程序在MacOS下运行时,性能要差4-5倍。绘画的性能对于显示数据的流畅滚动很重要。所以我的问题是,有没有人知道QPainter.drawLine的更快替代品来绘制线条(依赖于平台的解决方

c++ - g++ 生成的程序集看起来很难看

我对gcc汇编非常熟悉...最近我被迫使用g++进行一些代码清理。顺便提一下,我对汇编非常熟悉,因此出于好奇,我经常看看编译器生成的asm有多好。但是g++的命名约定很奇怪。我想知道是否有关于如何阅读其asm输出的指南?非常感谢。 最佳答案 我不觉得g++的asm“难看”或难以理解,尽管我已经使用GCC8年多了。在Linux上,函数标签通常以_ZN开头,“_ZN”前缀是指定C++名称重整(与C相对)的标记,后面是函数所属的命名空间,然后是函数名称和参数类型,然后是模板,如果有的话。示例://tests::vec4::testEqua

c++ - 一个类型是否应该只 move ,仅仅因为复制可能很昂贵?

我有一个可复制的类型,但复制成本可能很高。我已经实现了move构造函数和move赋值。但是我遇到了性能问题,人们在按值传递时忘记调用move()。删除复制构造函数并为实际需要复制的罕见情况提供显式copy()方法是否是一种好的C++11风格?这在其他语言(Ruby、JavaScript)中是惯用的,但我不知道C++标准库中有任何内容纯粹为了性能而禁止复制。例如,std::vector是可复制的,而std::unique_ptr和std::thread由于其他原因是不可复制的。 最佳答案 Shouldatypebemove-only,

c++ - valgrind 和 openmp,仍然可以访问并可能丢失,这很糟糕吗?

这里是C++新手。在过去的几天里,我一直在提高我的内存管理技能,根据valgrind,我的程序不再泄漏内存。事实上,我根本没有收到来自valgrind的警告。但是,当我将openmp循环添加到我的代码中时,我开始在valgrind(memcheck)中出现以下错误:(但没有绝对丢失的block)==6417==304bytesin1blocksarepossiblylostinlossrecord3of4==6417==at0x4C279FC:calloc(vg_replace_malloc.c:467)==6417==by0x4011868:_dl_allocate_tls(dl-t

Windows Azure 虚拟机在缩放时访问网络很慢

我在我的小型AzureVM上运行一些启动脚本(cmd/bat),其中包括来自已安装VHD的文件传输操作,通常它会在大约3分钟内完成(复制文件并提取~500Mbzip文件命令行7z)。当我扩展到大约150个实例时,相同的操作非常慢(总共最多15分钟,其中大部分时间由7z使用)。此外,完成启动过程最慢的节点最初很难使用mstsc访问(动画滞后并且需要花费大量时间才能登录),但这可能不相关。可能是什么问题?我们有检查缓存的想法,但最好知道在以下情况下可能存在的任何其他潜在瓶颈。更新:我尝试在D:\驱动器上解压,而不是在C:\上解压,并且在缩放到200时,解压缩大约需要一分钟!所以看起来问题是

c++ - 我如何限制堆的大小,这样当我分配很多时它不会让机器卡住?

有时我必须调试快速分配内存的程序(不是设计使然),当它发生时我的整个计算机就停止响应,因为物理内存达到100%(我有4GB内存),然后我必须按下重新启动按钮每次都不知道为什么会发生。有没有办法限制new或malloc堆的大小?我所说的限制是指它会像C#的OutOfMemoryException一样抛出异常。注意:我不能只选择所有的new和malloc并将其替换为自定义的分配器,这需要做很多工作。我尝试将项目属性->配置属性->链接器->系统->堆保留\提交大小设置为256MB或256000000但没有任何效果。 最佳答案 是的,使用

c++ - Windows 上的 Qt 5.1.0 使用 minGW 4.8 需要很长时间来调试

我已经从qt-project下载页面下载并安装了适用于Windows32位(MinGW4.8)的Qt5.1.0。我已经运行了安装程序,并且能够使用这些库和minGW4.832位工具链编译和运行应用程序。但是,我有一个大型应用程序,当我尝试调试它时(使用与minGW工具链捆绑在一起的gdb),开始运行需要大量时间,并且与应用程序的任何交互都需要很长时间去完成。不是烦人的时间,而是无法使用的时间。有没有其他人遇到过这个问题,有什么解决办法吗?如果这有帮助,我在调试时会得到很多输出:Temporarilydisablingbreakpointsforunloadedsharedlibrary

windows - 微软的ASLR很奇怪

我看了一个ASLReddllimagesbasedaddressfor32bitProcess.这不是完全随机化。它只是随机化了1/2的概率。例如,一旦我加载了一个dll,图像就会加载到0x12345678。然后我再次加载图像,图像加载到0x23456789。(基地址已更改!)但是我再次加载图像0x123456780x234567890x123456780x23456789...他们为什么要这样实现?是为了崩溃报告的频率吗?(为了获得重新部署的dll的相同崩溃地址) 最佳答案 这是设计使然。通常,Windows会在首次加载DLL时为