谁能告诉我如何对kcachegrind的结果感兴趣.
我有两个版本的代码(v1,v2)都在调试模式下编译.我通过valgrind用选项运行它们:
valgrind --tool=callgrind -v ....
这样生成的输出文件在kcachegrind中打开.现在我已经发现代码的版本v2运行速度比第一版v1更快,因为它意味着.但是我如何从kcachegrind的调用图中获得结果.
在kcachegrind All Callers选项卡中,我有以下列:Incl. , Distance, Called, Caller.
IIUC,Called并且caller在计划中没有被称为"来电者".但我不了解其他人.
另一件事是在选择特定功能然后在"呼叫者"选项卡上显示更多信息.Ir, Ir per call, count, caller
在类型选项卡中:`EventType,Incl.自我,简短,公式.
我在这里没有任何想法.
到目前为止,我读过这些问题:
我正在使用boost::scoped_ptr我想要替换的代码std::unique_ptr.我想知道搬家时是否有任何不利之处std::unique_ptr.Boost可跨平台和编译器移植.但我不确定C++ 11是否支持所有编译器,如MSVC.我知道GCC和Clang非常支持C++ 11.
我已经阅读了" intrusive_ptr在C++ 11中 " 的SO问题,其简短回答是"否".因此,如果有人有使用两者的经验,请分享您的意见和想法
是否通过不透明指针将 C++ 库包装到 C 提供了稳定的 ABI 接口?我很清楚 ABI 接口以及为什么 c++ 没有稳定的接口。这与名称修改和许多其他事情有关。我知道 C 在这部分非常稳定。与 C++ 相比,将 C 库包装成各种其他语言也很容易。这两个是为我的库制作 ac API 的驱动力。
将 C++ 库包装为 C 时,底层代码仍然是 C++。我的情况是 C++,带有 boost 共享 ptr 和其他依赖项。
那么既然底层代码是C++,那么ABI的稳定性是如何实现的。或者换句话说,共享库(.so、.dll 等)中仍然编译了 C++ 的东西。
我想知道它是如何工作的。也许有人可以为我提供一个很好地解释这些东西的例子。
在osx上可以启用的最小支持sse标志是什么?大多数硬件,我现在使用支持sse2.在Windows和Linux上,我有一些代码来测试sse支持.我在某处读到了osx长期以来对sse的支持.但我不知道哪个是可以启用的最低版本.最终的二进制文件将被复制到其他osx平台,所以我不能像GCC那样使用-march = native
如果在所有版本上默认启用它,在构建代码时是否必须传递-msse或-msse2标志?
这是编译器版本:
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
这是uname -a的输出
uname -a
Darwin mme.local 14.1.0 Darwin Kernel Version 14.1.0: Mon Dec 22 23:10:38 PST 2014; root:xnu-2782.10.72~2/RELEASE_X86_64 x86_64
Run Code Online (Sandbox Code Playgroud)
这是sysctl machdep.cpu.features的输出
machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 DTES64 MON DSCPL VMX EST TM2 SSSE3 CX16 TPR PDCM …Run Code Online (Sandbox Code Playgroud) 我正在将Visual Studio 2019与cmake项目一起使用。在Visual Studio IDE中打开cmake设置UI时,它将显示C ++项目的工具集列表。
从工具集列表中,我有msvc_x64和msvc_x64_x64。我想在本机x64上构建,因此我可以简单地选择msvc_x64。
但是,为什么有两个名为x64和x64_x64的工具集?
是同一件事还是为了某种向后兼容性而维护两个名称?
根据文档,我可以了解工具集的命名约定,例如msvc_x86_x64,amd64,x64_arm等。我想了解x64和x64_x64以及为什么这两个存在?
两者之间有什么区别吗?如果可以,我可以获得有关它的一些文档吗?
如何在 const char* 数组中分割多行字符串?
这是输入字符串。
const char* str = "122.123,-38.789"
"122.123,-39.78";
Run Code Online (Sandbox Code Playgroud)
我需要从中得到两个字符串。
str1 = "122.123,-38.789";
str2 = "122.123,-39.78";
Run Code Online (Sandbox Code Playgroud)
的输出
printf("string='%s'", str)
string='122.123,-38.789122.123,-39.78'
Run Code Online (Sandbox Code Playgroud)
应该怎么做才能分割这个字符串?
我知道 gcc 中有一个未初始化的警告,可以告诉您变量是否未初始化。这对我来说很清楚。但我想知道什么是“Maybe-Initialized”警告?
gcc 不确定这是否已初始化。或者考虑一下,代码正确初始化,gcc 认为“可能”它没有初始化。如果编译器不确定为什么我应该有这个警告?
现在我可以禁用警告-Wno-maybe-uninitialized或在代码中进行修复。
但我的问题是这意味着什么?为什么 gcc 认为它可能未初始化。gcc 确定变量已初始化,因为我没有得到-Wuninitialized.
我正在使用 GCC 4.8 Fedora 21 x86_64。
另外,如果有人可以展示如何触发此警告,我将不胜感激。
我在使用MSVC和GCC的std :: abs时得到的结果不正确
#include <cmath>
#include <iostream>
#include <complex>
int main()
{
std::cerr << std::sqrt((-6.)*(-6.) + 288.*288.) << "\n";
std::cerr << std::abs( std::complex<float>(-6, 288) ) << std::endl;
return 0L;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在VC++(带有更新的MSVS 2015 CE)和gcc 4.9.2上产生了不同的结果
使用MSVC
288.062
288.063
Run Code Online (Sandbox Code Playgroud)
与GCC
288.062
288.062
Run Code Online (Sandbox Code Playgroud)
现在实际结果是288.062,这对于gcc与std :: abs和std :: sqrt是正确的.但是当使用std :: sqrt和std :: abs时,msvc有不同的结果,这可能是msvc2015中的一个错误.
但是看看xcomplex的代码,我不明白_Fabs()的实现.有人可以帮助我理解这个特定的代码,并可能分析代码如何以这样的错误结束.
c++ ×7
c ×2
abi ×1
api ×1
boost ×1
c++11 ×1
callgrind ×1
cmake ×1
gcc ×1
gcc-warning ×1
kcachegrind ×1
macos ×1
optimization ×1
profiling ×1
split ×1
sse ×1
string ×1
unique-ptr ×1
valgrind ×1
visual-c++ ×1