刚刚遇到C++中的register关键字,我想知道这似乎是一个好主意(将某些变量保存在寄存器中)肯定是编译器默认执行此操作?
所以我想知道这个关键字是否还在使用?
在调试时,我突然开始在几乎每个GDB输出行上看到此消息:
Python异常安装错误:缺少gdb.execute_unwinders函数
这是什么?我该如何纠正呢?
(这篇文章是关于高频类型编程)
我最近在一个论坛(我认为他们正在讨论Java)上看到,如果你必须解析大量的字符串数据,那么使用字节数组比使用split()的字符串更好.确切的帖子是:
使用任何语言,C++,Java,C#的一个性能技巧是避免对象创建.这不是分配或GC的成本,而是访问不适合CPU缓存的大型内存阵列的成本.
现代CPU比它们的内存快得多.对于每个高速缓存未命中,它们会停止许多周期.大多数CPU转置预算都是通过大缓存和大量滴答来分配的.
GPU通过准备执行大量线程来隐藏内存访问延迟并且几乎没有缓存并将晶体管花费在更多内核上,从而以不同方式解决问题.
因此,例如,不是使用String和split来解析消息,而是使用可以就地更新的字节数组.你真的想避免在大型数据结构上进行随机内存访问,至少在内部循环中是这样.
他只是说"不要使用字符串,因为它们是一个对象并且创建对象是昂贵的"?还是他说了别的什么?
使用字节数组是否确保数据尽可能长时间保留在缓存中?当你使用字符串时它是否太大而无法保存在CPU缓存中?一般来说,使用原始数据类型是编写更快代码的最佳方法吗?
我理解当分支很容易预测时,使用IF语句会更好,因为分支是完全免费的.我已经了解到,如果不容易预测分支,那么CMOV会更好.但是,我不太明白这是如何实现的?
当然问题域仍然是相同的 - 我们不知道下一条指令的执行地址?因此,我不明白管道的所有方式,当CMOV执行时,如何帮助指令获取器(过去10个CPU周期)选择正确的路径并防止管道停顿?
有人可以帮我理解CMOV如何改进分支?
我目前正在查看CPU管道的各个部分,它们可以检测分支错误预测.我发现这些是:
我知道2和3检测到了什么,但我不明白在BTB中检测到了什么错误预测.BAC检测BTB错误地预测非分支指令的分支的位置,其中BTB未能检测到分支,或者BTB错误预测了x86 RET指令的目标地址.执行单元评估分支并确定它是否正确.
在分支目标缓冲区中检测到什么类型的错误预测?究竟在这里发现了什么错误预测?
我能找到的唯一线索是英特尔开发者手册第3卷(底部的两个BPU CLEAR事件计数器):

BPU在错误地认为未采取分支后预测了一个分支.
这似乎暗示预测并非"同步",而是"异步",因此"在错误地假设"之后?
更新:
Ross,这是CPU分支电路,来自最初的英特尔专利(如何用于"阅读"?):

我在任何地方都看不到"分支预测单位"?读过这篇论文的人会认为"BPU"是将BTB电路,BTB缓存,BAC和RSB分组在一起的懒惰方式吗?
所以我的问题仍然存在,哪个组件会引发BPU CLEAR信号?
optimization intel cpu-architecture computer-architecture branch-prediction
我知道C++中有三个而不是两个内存区域:堆栈,堆和静态分配功能的区域.我有两个问题
为什么堆比堆栈慢得多?当然它应该只是一个额外的间接水平?
为静态"特性"(变量,函数,类)分配的内存区域是否提供比堆更快的性能?
我正在阅读Agner Fog的一本手册,作为64位操作系统(超过32位)的优势,他说:
函数参数在寄存器中而不是在堆栈中传输.这使函数调用更有效.
他是说堆栈不用于传递函数参数(64位操作系统)吗?
我有以下代码:
#include <iostream>
#include <boost\filesystem.hpp>
int main(){
const char* file_path = "my_path";
std::cout << boost::filesystem::file_size(file_path) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
当我构建时,我得到以下错误:
1>Main.obj : error LNK2019: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" (?system_category@system@boost@@YAAEBVerror_category@12@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'native_ecat''(void)" (??__Enative_ecat@system@boost@@YAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (?generic_category@system@boost@@YAAEBVerror_category@12@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'errno_ecat''(void)" (??__Eerrno_ecat@system@boost@@YAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl boost::filesystem::path_traits::convert(char const *,char const …Run Code Online (Sandbox Code Playgroud) 我是否理解这一点,if语句更依赖于分支预测,而v-table查找更依赖于分支目标预测?关于v表,没有"分支预测",只有目标预测?
试图了解CPU如何处理v表.