草庐IT

OPTIMIZATION

全部标签

c++ - 间接运算符的 C++ 标准描述是否保证不会优化内存写入?

这基本上是thisquestion的延续.到目前为止,如果我有这样的功能,它看起来像这样:voidSecureZeroMemory(void*ptr,size_tcnt){volatilechar*vptr=(volatilechar*)ptr;while(cnt){*vptr=0;vptr++;cnt--;}}然后这样调用它:{charbuffer[size];SecureZeroMemory(buffer,size);}那么由于buffer没有声明为volatile,所以使用指向volatile的指针并不重要——数据本身不是volatile,因此写入变量不构成可观察行为(1.9/6

c++ - 间接运算符的 C++ 标准描述是否保证不会优化内存写入?

这基本上是thisquestion的延续.到目前为止,如果我有这样的功能,它看起来像这样:voidSecureZeroMemory(void*ptr,size_tcnt){volatilechar*vptr=(volatilechar*)ptr;while(cnt){*vptr=0;vptr++;cnt--;}}然后这样调用它:{charbuffer[size];SecureZeroMemory(buffer,size);}那么由于buffer没有声明为volatile,所以使用指向volatile的指针并不重要——数据本身不是volatile,因此写入变量不构成可观察行为(1.9/6

c++ - LTO 中的优化是否与正常编译中的相同?

在编译翻译单元时,编译器会进行大量优化-内联、常量折叠/传播、别名分析、循环展开、死代码消除以及许多我从未听说过的其他优化。在多个翻译单元之间使用LTO/LTCG/WPO时是否全部完成,或者只是完成了其中的一个子集(或变体)(我听说过内联)?如果没有完成所有优化,我会考虑统一构建优于LTO(或者当有超过1个统一源文件时可能同时使用它们)。我的猜测是它不一样(统一构建具有完整的优化集),而且它在编译器之间变化很大。每个编译器的lto文档并没有准确回答这个问题(或者我无法理解它)。由于lto涉及将中间表示保存在目标文件中,理论上LTO可以进行所有优化......对吗?请注意,我不是在询问构

c++ - LTO 中的优化是否与正常编译中的相同?

在编译翻译单元时,编译器会进行大量优化-内联、常量折叠/传播、别名分析、循环展开、死代码消除以及许多我从未听说过的其他优化。在多个翻译单元之间使用LTO/LTCG/WPO时是否全部完成,或者只是完成了其中的一个子集(或变体)(我听说过内联)?如果没有完成所有优化,我会考虑统一构建优于LTO(或者当有超过1个统一源文件时可能同时使用它们)。我的猜测是它不一样(统一构建具有完整的优化集),而且它在编译器之间变化很大。每个编译器的lto文档并没有准确回答这个问题(或者我无法理解它)。由于lto涉及将中间表示保存在目标文件中,理论上LTO可以进行所有优化......对吗?请注意,我不是在询问构

c++ - atoi() 和 atof() 缓存吗?它们似乎执行得越快,调用的次数越多

我使用_rdtsc()对atoi()和atof()进行计时,我注意到它们花费了很长时间。因此,我编写了自己的这些函数版本,这些版本比第一次调用要快得多。我使用的是Windows7VS2012IDE,但使用的是IntelC/C++编译器v13。我启用了-/O3和-/Ot(“喜欢快速代码”)。我的CPU是IvyBridge(移动)。经过进一步调查,似乎atoi()和atof()被调用的次数越多,它们执行得越快??我说的速度更快:当我从循环外部调用atoi()时,仅一次,它需要5,892个CPU周期,但经过数千次迭代后,这减少到300-600个CPU周期(相当大的执行时间范围)。atof()

c++ - atoi() 和 atof() 缓存吗?它们似乎执行得越快,调用的次数越多

我使用_rdtsc()对atoi()和atof()进行计时,我注意到它们花费了很长时间。因此,我编写了自己的这些函数版本,这些版本比第一次调用要快得多。我使用的是Windows7VS2012IDE,但使用的是IntelC/C++编译器v13。我启用了-/O3和-/Ot(“喜欢快速代码”)。我的CPU是IvyBridge(移动)。经过进一步调查,似乎atoi()和atof()被调用的次数越多,它们执行得越快??我说的速度更快:当我从循环外部调用atoi()时,仅一次,它需要5,892个CPU周期,但经过数千次迭代后,这减少到300-600个CPU周期(相当大的执行时间范围)。atof()

c++ - `std::string` 分配是我当前的瓶颈 - 如何使用自定义分配器进行优化?

我正在写C++14JSONlibrary作为练习并在我的个人项目中使用它。通过使用callgrind,我发现currentbottleneckduringacontinuousvaluecreationfromstringstresstestisanstd::stringdynamicmemoryallocation.准确地说,瓶颈是从std::string::reserve对malloc(...)的调用。我已经阅读了许多现有的JSON库,例如rapidjson使用自定义分配器来避免在字符串内存分配期间调用malloc(...)。我试图分析rapidjson的源代码,但大量的附加代码和

c++ - `std::string` 分配是我当前的瓶颈 - 如何使用自定义分配器进行优化?

我正在写C++14JSONlibrary作为练习并在我的个人项目中使用它。通过使用callgrind,我发现currentbottleneckduringacontinuousvaluecreationfromstringstresstestisanstd::stringdynamicmemoryallocation.准确地说,瓶颈是从std::string::reserve对malloc(...)的调用。我已经阅读了许多现有的JSON库,例如rapidjson使用自定义分配器来避免在字符串内存分配期间调用malloc(...)。我试图分析rapidjson的源代码,但大量的附加代码和

c++ - 没有使用 gcc 的小字符串优化?

大多数std::string实现(包括GCC)使用小字符串优化。例如。有一个answer讨论这个。今天,我决定检查我编译的代码中的字符串在什么时候被移动到堆中。令我惊讶的是,我的测试代码似乎表明根本没有发生任何小的字符串优化!代码:#include#includeusingstd::cout;usingstd::endl;intmain(intargc,char*argv[]){std::strings;coutg++test.cc&&./a.out的输出是capacity:00x7fe405f6afb8|0x7b0c38|a0x7b0c68|aa0x7b0c38|aaa0x7b0c3

c++ - 没有使用 gcc 的小字符串优化?

大多数std::string实现(包括GCC)使用小字符串优化。例如。有一个answer讨论这个。今天,我决定检查我编译的代码中的字符串在什么时候被移动到堆中。令我惊讶的是,我的测试代码似乎表明根本没有发生任何小的字符串优化!代码:#include#includeusingstd::cout;usingstd::endl;intmain(intargc,char*argv[]){std::strings;coutg++test.cc&&./a.out的输出是capacity:00x7fe405f6afb8|0x7b0c38|a0x7b0c68|aa0x7b0c38|aaa0x7b0c3