精华内容
下载资源
问答
  • 从 vs2019 中提取的最新版微软C/C++优化编译器(cl,命令行使用),精简便携,易于使用,欢迎下载!
  • C++优化指南

    2018-07-25 16:42:30
    c++优化相关文档,包括calling_conventions instruction_tables microarchitecture optimizing_assembly optimizing_cpp,值得c++开发者详细研究学习
  • c++优化技术

    2018-08-02 10:43:28
    c++优化技术, 包括c++开发中常用到的各个方面,包括c++11的线程等,甚至最基础的iostream优化技术
  • c++优化 变量优化

    2013-05-06 22:00:14
    c++优化 Runtime Library链接哪种运行时刻函数库通常只对程序的性能产生影响。 优化:这是造成错误的主要原因,因为关闭优化时源程序基本上是直接翻译的,而打开 优化后编译器会作出一系列假设。这类错误主要有以下...
  • 自己总结出来的算法问题,希望对你们有所帮助,其实应该是很有用的。
  • c++应用程序性能优化

    2018-06-27 14:30:47
    本书深入浅出的讲解了C++性能优化,由程序优化基础,内存使用优化,程序启动性能优化以及性能工具4部分组成
  • c++优化工具Gprof

    千次阅读 2017-02-20 22:21:23
    c++优化工具Gprof
     
    

    优化准则:

    1. 二八法则:在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的;在优化实践中,我们将精力集中在优化那20%最耗时的代码上,整体性能将有显著的提升;这个很好理解。函数A虽然代码量大,但在一次正常执行流程中,只调用了一次。而另一个函数B代码量比A小很多,但被调用了1000次。显然,我们更应关注B的优化。
    2. 编完代码,再优化;编码的时候总是考虑最佳性能未必总是好的;在强调最佳性能的编码方式的同时,可能就损失了代码的可读性和开发效率;

    工具:

    1 Gprof

    工欲善其事,必先利其器。对于Linux平台下C++的优化,我们使用gprof工具。gprof是GNU profile工具,可以运行于linux、AIX、Sun等操作系统进行C、C++、Pascal、Fortran程序的性能分析,用于程序的性能优化以及程序瓶颈问题的查找和解决。通过分析应用程序运行时产生的“flat profile”,可以得到每个函数的调用次数,消耗的CPU时间(只统计CPU时间,对IO瓶颈无能为力),也可以得到函数的“调用关系图”,包括函数调用的层次关系,每个函数调用花费了多少时间。

    2. gprof使用步骤

    1) 用gcc、g++、xlC编译程序时,使用-pg参数,如:g++ -pg -o test.exe test.cpp编译器会自动在目标代码中插入用于性能测试的代码片断,这些代码在程序运行时采集并记录函数的调用关系和调用次数,并记录函数自身执行时间和被调用函数的执行时间。
    2) 执行编译后的可执行程序,如:./test.exe。该步骤运行程序的时间会稍慢于正常编译的可执行程序的运行时间。程序运行结束后,会在程序所在路径下生成一个缺省文件名为gmon.out的文件,这个文件就是记录程序运行的性能、调用关系、调用次数等信息的数据文件。
    3) 使用gprof命令来分析记录程序运行信息的gmon.out文件,如:gprof test.exe gmon.out则可以在显示器上看到函数调用相关的统计、分析信息。上述信息也可以采用gprof test.exe gmon.out> gprofresult.txt重定向到文本文件以便于后续分析。

    以上只是gpro的使用步骤简介,关于gprof使用实例详见附录1;

    实践

    我们的程序遇到了性能瓶颈,在采用架构改造,改用内存数据库之前,我们考虑从代码级入手,先尝试代码级的优化;通过使用gprof分析,我们发现以下2个最为突出的问题:

    1.初始化大对象耗时

    分析报告:307 6.5% VOBJ1::VOBJ1@240038VOBJ1
    在整个执行流程中被调用307次,其对象初始化耗时占到6.5%。

    这个对象很大,包含的属性多,属于基础数据结构;
    在程序进入构造函数函数体之前,类的父类对象和所有子成员变量对象已经被生成和构造。如果在构造函数体内位其执行赋值操作,显示属于浪费。如果在构造函数时已经知道如何为类的子成员变量初始化,那么应该将这些初始化信息通过构造函数的初始化列表赋予子成员变量,而不是在构造函数函数体中进行这些初始化。因为进入构造函数函数体之前,这些子成员变量已经初始化过一次了。

    在C++程序中,创建/销毁对象是影响性能的一个非常突出的操作。首先,如果是从全局堆中生成对象,则需要首先进行动态内存分配操作。众所周知,动态分配/回收在C/C++程序中一直都是非常耗时的。因为牵涉到寻找匹配大小的内存块,找到后可能还需要截断处理,然后还需要修改维护全局堆内存使用情况信息的链表等。

    解决方法:我们将大部分的初始化操作都移到初始化列表中,性能消耗降到1.8%。

    2.Map使用不当

    分析报告:89 6.8% Recordset::GetField
    Recordset的getField被调用了89次,性能消耗占到6.8%;
    Recordset是我们在在数据库层面的包装,对应取出数据的记录集;(用过ADO的朋友很熟悉);由于我们使用的是底层c++数据库接口,通过对数据库原始api进行一层包装,从而屏蔽开发人员对底层api的直接操作。这样的包装,带来的好处就是不用直接与底层数据库交互,在代码编写方面方便不少,代码可读性也很好;带来的问题就是性能的损失;

    分析:(2点原因)
    1)在GetField函数中,使用了map[“a”]来查询数据,如果找不到“a”,则map会自动插入key ”a”,并设value为0;而m.find(“a”)不会自动插入上述pair,执行效率更高;原有逻辑:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
         string Recordset::GetField( const  string &strName)
    {
         int  nIndex;
         if  (hasIndex== false )
         {
             nIndex = m_nPos;
         }
         else
         {
             nIndex = m_vSort[m_nPos].m_iorder;
         }
         if  (m_fields[strName]==0)
         {
             LOG_ERR( "Recordset::GetField:" <<strName<< " Not Find!!" );
         }
         return  m_records[nIndex].GetValue(m_fields[strName] - 1) ;
    }

    改造后的逻辑:

    1
    2
    3
    4
    5
    6
    7
         string Recordset::GetField( const  string &strName)
    {
         unordered_map::iterator iter = m_fields.find(strName);
         if  (iter == m_fields.end())
         {
             LOG_ERR( "[Recordset::GetField] " << strName <second - 1) ;
    }

    调整后的Recordset::GetField的执行时间约是之前的1/2;且易读性更高;

    2)在Recordset中,对于每个字段的存储,使用的是map m_fields; g++中的stl标准库中默认使用的红黑树作为map的底层数据结构;
    通过附录中的文档2,我们发现其实有更快的结构, 在效率上,unorder map优于hash map, hash map 优于 红黑树;如果不要求map有序,unordered_map 是更好的选择;
    解决方法:将map结构换成unordered_map,性能消耗降到1.4%;

    总结

    我们修改不到30行代码,整体性能提升10%左右,效果明显;打蛇打七寸,性能优化的关键在于找准待优化的点,之后的事,也就水到渠成;

    附录:

    附1:prof工具介绍及实践
    附2: map hash_map unordered_map 性能测试

    展开全文
  • 网站下载的关于 C++ 性能 优化的,很不错 作者是 Pete Isensee,微软的XNA 游戏平台开发主管。内有各种代码及算法上的优化比较和统计,还有STL各种容器类的使用效率参考表,希望对大家有用。
  • C++优化方法C++有效使用内存,C++编程优化
  • 杨庆雄老师的立体匹配MST滤波优化算法代码C++ VS环境,VS2013可以运行,代码内容详参考论文《Qiongxiong Yang,Stereo Matching Using Tree Filtering》
  • C++ 优化内存

    2014-05-12 12:15:24
    c++实现优化释放内存,实时获取释放内存的大小
  • C++ 性能优化指南 高清 PDF 书签 希望对你有帮助。
  • census 立体匹配算法c++实现 可直接运行或进行修改
  • C++优化 —— 字符串优化

    千次阅读 2018-01-17 16:54:57
    这篇博客介绍了C++中常用的用于优化C++性能的手法。 背景 最近开始读Optimized C++,因此也会开始记录一些读书笔记。然后呢……由于入职鹅厂,考虑到项目保密这一块,因此以后的UE4相关的博客可能会少更一些,...

    这篇博客介绍了C++中常用的用于优化C++性能的手法。


    背景

    最近开始读Optimized C++,因此也会开始记录一些读书笔记。然后呢……由于入职鹅厂,考虑到项目保密这一块,因此以后的UE4相关的博客可能会少更一些,就算要更估计也是只会和个人研究相关了……

    C++的字符串与性能

    字符串的动态分配

    相比起C的函数(例如strcat()strcpy())是操作在固定长度的字符数组上来说,C++的字符串使用起来更加方便 —— 这是因为它可以在需要的时候自动变长。为了实现这个效果,C++的字符串是动态分配的,而动态分配则是非常昂贵的。

    std::vector类似,std::string采用的是当字符串变长时,另外分出一块更大的空间来用于储存这个字符串。有一些实现方法是直接将当前的字符串长度翻倍。这样的好处在于可以比较好的应对字符串频繁变动的情况,而坏处在于有可能会浪费一部分内存空间。

    字符串是值类型

    在对字符串进行赋值或者其他操作时,字符串往往表现为值类型(Value Object)。关于Value Object与Entities的区别这里就不展开讲,可以参考这篇博客

    例如说,在进行字符串连接的操作(concatenate):s1 = s2 + s3 + s4时。由于字符串是值类型的,因此首先s2 + s3的结果会被作为一个单独的值类型保存在内存中,而后与s4进行连接时,会将结果暂存到另一个动态分配的内存中,这个值取代原来s1的值。最后,内存管理器会把原来s1与之前的那些暂存的值给free掉。

    这就意味着对于调用了很多次的内存管理函数,对于性能会出现影响。

    字符串会导致很多复制操作

    由于字符串是值类型,因此你在修改一个字符串的时候不可以影响到另一个字符串。但是的的确确的,我们有时候需要对一个字符串进行修改。因此对每个字符串,它们都需要表现得像有一个对应内容的私人备份一样。

    为了解决这种问题,比较常用的方法就是写时复制(”Copy on Write”,也成为COW),也就是说只在被创建、赋值或者作为变量被传入函数的时候复制一份。

    在写时复制的情况下,字符串们可以通过引用计数的方式共享那些被动态分配的内存。当一个字符串被赋值为其中一个已经被记录下来的字符串时,此时只复制一个指针,并且计数+1.当字符串要进行改动或者其他操作时,会先检测这个字符串是否只有一个指针记录,如果有多个指针指向这个字符串,那么需要额外开辟内存,并且复制一份这个字符串,然后再进行处理。

    因此,当你的string是使用COW的方式实现的话,赋值和传参操作性能会比较好,但是当字符串被多个指针指向的时候,所有的non-const针对可能进行修改字符串的函数都是比较贵的。

    到了C++11,字符串的复制性能消耗或多或少的会被右值引用以及std::Move操作又花了不少。如果一个函数是将一个右值引用作为参数的话,那么此时的字符串可以直接进行一次指针复制即可,就节省了一次复制操作。

    示例以及分析

    这里以一个去掉字符串中所有的控制字符的函数为例,分析一下优化方案:

    std::string remove_ctrl(std::string s)
    {
        std::string result;
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= 0x20)
                result = result + s[i];
        }
    }

    针对于string的不同实现方案,上面的代码的性能分析也会不一样:

    • 如果string是使用COW的形式实现的,那么上面这段代码的赋值操作会很快 —— 它并不会进行复制字符串,而只会复制一个指针并且将引用数+1。
    • 如果string没有使用共享缓存的方式实现,那么对于赋值操作来说,它会进行一次复制。这样一来会导致很多次的内存分配。
    • 如果编译器有实现C++11的右值引用和Move语意,那么在进行字符串连接的时候产生的结果会是一个右值引用。因此编译器会调用这个结果的Move构造函数,而不是拷贝构造函数。

    使用内置的mutating函数去除Temporary Strings

    由于直接的字符串连接操作,会导致出现很多的缓存字符串。所以为了避免这种情况的发生,可以将代码改为如下:

    std::string remove_ctrl_mutating(std::string s)
    {
        std::string result;
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= 0x20)
                result += s[i];
        }
    }

    使用内置的+=操作符,可以避免了Temporary String的操作。类似于std::vector,它能够比较好地处理对于内存的分配操作。

    对于统计结果来说,这个优化方案将原有的24.8ms优化到了1.72ms,是很有效的优化操作。

    使用预留空间来去除内存的Reallocation

    上面的代码在不停的+=过程中,当字符串的capacity满了后,字符串还是会再次分配一块更大的内存,然后再将信息拷贝过去。这些操作也会带来一些复杂度为O( LogN )的内存开销。因此可以通过预留内存的方案来去除掉这部分的开销,代码如下:

    std::string remove_ctrl_reserve(std::string s)
    {
        std::string result;
        result.reserve(s.length());
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= 0x20)
                result += s[i];
        }
    }

    对于统计结果来说,这个优化方案被优化到1.47ms。但是与之相对的,会额外占用一些内存。

    通过const引用来去除传参时的复制操作

    由于这个函数并不需要对字符串s进行改动,但是如果进行函数传一个字符串的参数的时候,针对直接的传值调用或者non-const的引用,都会对原有字符串进行一次复制。因此可以考虑将这个复制操作去掉,代码如下:

    std::string remove_ctrl_ref_args(std::string const& s)
    {
        std::string result;
        result.reserve(s.length());
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= 0x20)
                result += s[i];
        }
    }

    通过这样的方法,本质上会将这个复制操作去掉,但是优化方案到了1.60ms,比上面的还要多,这是为什么呢?

    其实,这个问题是源于引用内部本质上是用指针实现的,对于引用s来说,每一次访问s[i]都会产生一次Dereference操作,所以会导致优化方案反而要花更多时间。

    通过iterator来消除Dereference

    所以上面的问题是源于在遍历整个字符串的时候,针对每一个字符串都会有两次Dereference。这里可以通过iterator来消除这两个Dereference操作:

    std::string remove_ctrl_ref_args_it(std::string const& s)
    {
        std::string result;
        result.reserve(s.length());
        for (auto it = s.begin(), end = s.end(); it != end; ++it)
        {
            if (*it >= 0x20)
                result += *it;
        }
    }

    使用这上面的代码,将性能优化到了1.04ms。但是这里有两个变量,一个是iterator,一个是使用const引用,因此考虑下面的代码:

    std::string remove_ctrl_reserve_it(std::string s)
    {
        std::string result;
        result.reserve(s.length());
        for (auto it = s.begin(), end = s.end(); it != end; ++it)
        {
            if (*it >= 0x20)
                result += *it;
        }
    }

    上面的代码的性能为1.26ms,因此可以得出结论使用const引用是对性能有优化的。

    去掉返回字符串的复制操作

    如果使用上述的操作,当一个结果被返回时,C++会把这个返回结果拷贝到运行栈的上下文(当然编译器会努力帮你优化来避免这个复制,取决于不同的编译环境)。因此,可以通过传入引用的方式消除这个操作:

    std::string remove_ctrl_ref_result_it(std::string& result, std::string const& s)
    {
        result.clear();
        result.reserve(s.length());
        for (auto it = s.begin(), end = s.end(); it != end; ++it)
        {
            if (*it >= 0x20)
                result += *it;
        }
    }

    这种方案最终能够优化到1.02ms,但是相对来讲并不那么好使用,看起来没有那么直观。

    思考和感想

    其实……如果是仅仅为了实现这个函数的目的,完全可以达到更好的性能 —— 例如不进行一个字符一个字符而是一子序列的查找,又或是进行string::erase操作可以完全避免内存重分配的方法,但这篇博客的重点不是实现这个函数。

    问题是其实这些知识点以前都晓得,也都学过。但是没有办法把这些知识点和性能优化结合起来 —— 这也是学到的一点吧……

    <全文完>

    展开全文
  • optimizing C++ C++优化-英文版
  • ndk-build C++优化

    千次阅读 2013-06-11 21:55:29
    ndk-build C++优化 随着Android NDK(本机开发套件)披露了许多的新设备和新功能,现在我们可以充分利用这些ARM设备了。下面列举了一些快速提示,希望对您有所帮助。 1 - 关注目标 最新的设备...


    ndk-build C++优化



    随着Android NDK本机开发套件)披露了许多的新设备和新功能现在我们可以充分利用这些ARM设备了。下面列举了一些快速提示,希望对您有所帮助。

    1 - 关注目标

    最新的设备一般是ARMv7,这意味着它可以使用v7版本和功能。最新版的NDK增加了ARMv7NEON代码支持,可以实现关键循环操作和媒体操作优化,远超其它方法。NDK提供小型静态库,可以帮助您识别运行时的选项。有关如何使用这些功能的示例,请参见NDK样本目录中的hello-neon示例项目。

    v6是较旧的设备,但是NDK未提供专门支持,您需要自己选择是安全地构建v5TE还是冒险尝试可能是v5TE的设备。如果您对速度无甚要求,并清楚目标硬件是什么,则可以尝试构建v6。尽管无法避免狂热爱好者将新版的OS装入旧硬件上,但事实是支持Android 2.0及以上版本的最新设备通常是基于ARMv7的。如果有选择的话,最好专注于采用NEON实施方案的ARMv7

    2 - 不要仓促优化

    除非您计划移植现有的C++应用程序,否则不要仓促编译本机代码。首先确保应用程序正确运行并仔细地profiling配置。成为瓶颈的要素通常是您意想不到的。近期的手持设备都具有两级缓存,有时还有用于节省电量的时钟调度,再加上Google为了提高OS性能而付出的长期努力,我们将会看到更多惊喜。

    3 - 优化,悄无声息

    不留痕迹。为了得到额外的运行周期会诱使您打破设计,但如非特殊情况,应避免这样。执行优化时,轻轻进入,迅速将应用程序关键部分转为本机或汇编代码,然后不留痕迹地退出。这样,您不用牺牲可维护性和调试便利性。当然,如果您确定重新设计可以带来足够的速度且值得付出代价,则可放手大干。

    4 - 围绕优化实施重构

    设计完成后,务必重新排列代码以使其更加适于优化,但一旦本机代码开始工作,则要避免修补过度。Java代码更易重新排列和调试。通常应先在Java层面优化,以便让逻辑块接受本机代码。在移植本机代码时,在Java层面改变算法或数据结构更具优势且更易处理。

    5 - 维护Java的异常处理

    执行不支持的本机代码是个糟糕的主意;即使理想状态下,它也可能造成应用程序意外退出。开发人员可以大胆推测本机代码是否与运行程序的设备兼容,只要有Java实施方案,您可以随时退回Java。这就是技巧4中优化Java版本的好处所在。

    6 - 小心的分配内存

    不论何时,在Java中尽可能用Java来分配,而不要拖延到以后调用C函数来解围。这样才能最大程度地减少泄漏并使Java代码保持简洁。如果有长期操作,则应在本地分配暂存空间,但请注意您的指针 - 编写大量Java代码时,围绕指针准则的旧C语言习惯可能会忘得很快。

    7 - 谨慎采用多线程

    已经有好几个采用多ARM内核的开发平台,客户使用它们的速度可能比您想像的更快。这样的想法会诱使您将所有任务都分割为多线程。总的来说这是个好主意,但切记,加重系统负载尽管能提升速度,也会牺牲用户体验。当然,巧妙使用线程非常地有效。Android系统自身会创建几条线程去运行一个应用程序,然而它们一般都在等待事件,所以如果您自己创建太多活动执行线程,可能会削弱它们的运行能力,适得其反地降低整体用户体验。

    8 - Java层的线程

    如果将逻辑分为多个线程,应尽可能通过Java执行,而不要采用Pthreads。使用Java VM管理访问可以降低风险,且有更多的语言层工具。如果您担心设置成本,采用现有的小型工人池应该不会太困难。切记将长期任务的更新发回到主UI线程,以确保用户知悉。另外请牢记一条重要的Android NDK规则:不要在UI线程上运行本机代码。事实上,最好不在UI线程上运行任何Java代码;Android有相应的API(请查看Handler类)可在非UI线程上经济运行任务。

    9 - 懂得何时使用汇编程序

    C或C++可以立即带来速度提升,而不需要编写比Java要难以维护的代码。也可通过将代码关键部分转换为汇编程序来实现进一步提升,但需要在耗费的时间、精力与最终受益之间做出权衡。最好先发布工作代码,在以后发布快速升级,而不是永无休止的调试。尽管如此,如果您十分清楚想要做什么,也许可以获得更多性能。

    切记要检查发布出来的GCC,这一点至关重要。objdump是一款非常有用的工具,谷歌NDK下载目录位于build/prebuilt/linux-x86/arm-eabi-4.4.0/arm-eabi/bin下提供了一种版本。

    10 - 懂得如何使用NEON

    NEON是一个非常强大的工具,在理想环境中,可给优化汇编程序提供8倍的性能提升,但并不适用于所有环境。要了解如何充分利用NEON,请阅读本博客中的NEON指南。

    View post in English.


    Dave,ARM首席工程师致力于虚拟机的维护、优化、检查至少十年,为硬件工程师解答有关虚拟机的问题。在Java领域经营多年后,他得以抽出时间研究工具,现在正着力于研究并理解Android


    示例:

    Android ffmpeg的x86编译和优化


    基于FFMPEG的Android-ARM项目很多,最具有代表性的有2个:

    havlenapetr :最早期的完全基于FFMEPG的android开源项目,整个项目比较简单,音视频同步做的很初步,音视频的显示是直接在android工程内添加hack,直接从NDK层调用系统的音视频输出。该项目比较简单,但是整个工程的编译写的非常好,适合初学者学习和移植ffmpeg,项目地址:https://github.com/havlenapetr

    VideoLAN:(简称 VLC):整合了FFMEPG和众多开源项目,全平台全格式,且有网络支持,VLC大而全,功能完善,所有功能都实现为独立的module,且各个module可以动态加载。VLC也支持android全平台,视频输出使用系统库,只是VLC相当复杂,不太好移植项目地址:http://git.videolan.org/


    展开全文
  • Keil中C/C++优化等级选几?

    千次阅读 2013-12-14 15:52:24
    (1)3是最高优化,省了很多空间,0是不优化,很多多余的东西都占地方,连接出来不是RAM不够就是ROM不够,或者堆栈越界之类的错误了 (2)不是代码设计问题,同一个程序可以用查表法,也可以用其他的方法等,除法...
    拿到别人的一份代码,他选的是Level 3,如果选成 Level 0,链接会出错。
    
    这意味着什么?

    如果需要优化后代码才能运行,那是不是意味着,代码设计有问题(RAM的使用)?

    (1)3是最高优化,省了很多空间,0是不优化,很多多余的东西都占地方,连接出来不是RAM不够就是ROM不够,或者堆栈越界之类的错误了

    (2)不是代码设计问题,同一个程序可以用查表法,也可以用其他的方法等,除法可以用/也可以用移位来实现,不同的实现方法花费的时间和空间不一样的,一般来说优化后能运行的,不优化就肯定能运行的吧,只是效率问题了,这就是常说的牺牲时间换空间或者牺牲空间换时间了

    (3)最近在做STM32模拟IIC的时序时,发现优化等级设置为-O1的时候能够正常运行,但是设置成-O2,-O3的时候就出错了,并且延时时间变得很难调整,正式被这个害惨了

    展开全文
  • C++性能优化技术

    千次下载 热门讨论 2014-01-23 13:19:27
    C++性能优化技术,详细介绍了可以普遍提升的一些C++变成技巧,是您精通优化技术的良师益友。
  • 优化C ++Optimizing C++

    2019-11-15 18:20:41
    为C ++程序员提供了一种实用的,实际的程序优化方法。
  • 介绍了C++应用程序优化,以及处理器,编译器相关的知识,文中优化库链接可用,轻薄短小,内容丰富。
  • 2: 使用-Os -O3 参数优化代码,其中-Os专门可优化大小 如下: if (${PLATFORM} STREQUAL "android") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") SET(CMAKE_CXX_FLA...
  • c++的内存优化

    千次阅读 2019-01-18 17:43:33
    2.内存优化有哪些方式 3.怎样做内存优化 概述: 我们常常在开发场景下提及的内存是指程序内存. 程序内存可以分为以下五种: 1、 栈区(stack):栈的空间是连续的, 先进后出能保证不会产生内存碎片, 由高地址向低...
  • C++性能优化指南》

    2019-10-08 20:35:08
    (1)C++ 代码优化策略总结: 1. 用好的编译器并与好编译器 (1)使用支持C++11的编译器,-std-c++11, (2)打开编译器的优化选项,-O2,但是代码调试过程会变的困难 (3)打开函数内联优化选项,inline (4)编译器...
  • c++性能优化

    2018-09-30 16:21:23
    c++性能优化的经典
  • KEIL5中C/C++优化等级问题

    千次阅读 2019-05-12 09:52:58
    C/C++优化等级会对程序产生 不定性的影响,至于选择哪种优化等级必须从 现有的程序分析才行 可参考知乎上的讲解 原文 0Minimum optimization. Turns off most optimizations.It gives the best possi...
  • C++ cin速度优化

    千次阅读 2019-09-14 12:17:03
    很多C++的初学者可能会被这个问题困扰,经常出现程序无故超时,最终发现问题处在cin和cout上,(甚至有些老oier也会被这个问题困扰,每次只能打scanf和printf,然后一堆的占位符巨麻烦),这是因为C++中,cin和cout...
  • c++应用程序优化之一变量内存的优化 c++优化的细节非常多,从这次起开始一个个的说明一下,有些是来自书本,有些来自经验 ,有些来自网上的其它的一些资料,优化的方法是相同的,所以只介绍原理和方法。针对c++11...
  • 本资源只是业余学习之用,如有涉及侵权,还请其他告知,谢谢
  • C++优化之使用emplace

    万次阅读 多人点赞 2017-07-21 08:40:07
    C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等,这些容器极大的方便了我们的开发。在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的...
  • c++ 编译器优化引起的问题

    千次阅读 2019-01-23 11:00:29
    int fun1(int& num) { if(num) num += 100; } int fun2(int& num) ... //不通编译器优化执行方向不同,返回结果不通,多模算法都可能出现类似问题,不推荐...不通编译器甚至同一编译器的不同优化都有可能出现类似情况

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 325,343
精华内容 130,137
关键字:

c++优化

c++ 订阅