我记得在某处在线阅读,在极端低延迟的情况下,最好使用虚函数代替IF语句.
这是真的?他们基本上说动态多态性对于速度情况更好吗?
是否有任何用户可以分享任何其他C++低延迟"怪癖"?
用户可以帮我找一些适合在Unix平台上编写C/C++代码的书吗?
我的重点是编写低延迟代码,用于电子交易平台.
(我意识到StackOverflow上有一些线程一般会询问有关语言的书籍,但我的Q专门针对Unix OS上的编码)
我读(某处),finalize()当子类被垃圾收集时,不能保证调用父类,这是否意味着大多数开发人员finalize()在子类中重写并调用super.finalize()?
标题几乎说明了所有派生类必须重新包含从头文件中的父类继承的函数/数据成员的定义?
可以从继承语句隐含继承的函数/成员吗?它们是否应该为了可读性而明确重新声明,否则这可能会隐藏?
我不确定我应该在派生类的头文件中做什么.
我理解一个好的编译器可以执行优化,以便访问,例如,int*通过std::shared_ptr使用相同的程序集完成,就像使用原始int*指针一样.
我的问题是:包含优化的智能指针的缓存行是否会被智能指针中的其他数据成员污染,如引用计数器?因此,虽然生成的程序集与实际指针相同,但缓存性能可能更差,因为没有那么多的缓存行被有效使用?
编辑:如果我们迭代像这样的结构std::vector<std::shared_ptr<int>>并使用整数,这种性能影响会更加明显.
我有一个包含两个数据成员的结构:
struct A{
short b;
short c;
};
Run Code Online (Sandbox Code Playgroud)
以及包含许多这些struct对象的向量:
std::vector<A> vec;
Run Code Online (Sandbox Code Playgroud)
在运行时,数据成员A.b和A.cstruct对象设置为零/值x.然而,b并c必须在相同的时间-一个不能在没有其他分别更新修改.我正计划使用原子compare_exchange_weak()来进行更新.
我不确定我是否应该将每个结构体表示为std::atomic<A>向量中,或者我是否应该在结构中放置一个联合,将两个短路组合成一个uint32_t然后修改它:
union A {
struct {
short b;
short c;
};
uint32_t d;
};
Run Code Online (Sandbox Code Playgroud)
什么是最好的解决方案?我应该存储以下矢量:
std::vector<uint32_t>
Run Code Online (Sandbox Code Playgroud)
并且在访问每个元素时,reinterpret_cast到A,以获得d?
我希望锁定尽可能地最少侵入.
不需要可移植性,这将在Linux,64位,x86,GCC 4.8+编译器上
在GDB我想watch写入一个内存地址。watch但是,是否可以在写入地址时设置so,而不是中断到命令行,而是打印回溯并继续执行?
我理解通过依赖缓存一致性协议(MESI/MESIF)xsub(),可以在不使用LOCK前缀的操作上保证原子性.
1)缓存一致性协议如何做到这一点?
它让我想知道缓存一致性协议是否可以强制执行原子性,为什么我们需要特殊的原子类型/指令等?
2)如果MOSI跨多核系统实现原子指令那么目的是LOCK什么?遗产?
3)如果MOSI实现原子指令并且MOSI用于所有指令 - 那么为什么原子指令成本太高?当然,性能应该与普通指令相同.
我原本认为缓存一致性协议(如MESI)可以提供伪原子性,但仅限于单个内存加载/存储指令.如果我正在执行获取,修改,写入指令组合,单独的MESI将无法在第一条指令到最后一条指令中强制执行原子性.
但是,英特尔参考手册第3a卷第8节说:
8.1.4 LOCK操作对内部处理器高速缓存的影响
对于P6和更新的处理器系列,如果在LOCK操作期间被锁定的存储器区域被高速缓存在执行LOCK操作作为回写存储器并且完全包含在高速缓存行中的处理器中,则处理器可能不会断言总线上的LOCK#信号.相反,它将在内部修改内存位置并允许其缓存一致性机制,以确保以原子方式执行操作.此操作称为"缓存锁定".缓存一致性机制自动防止缓存相同内存区域的两个或多个处理器同时修改该区域中的数据.
这似乎与我的理解相矛盾,暗示LOCK指令不需要使用,因为可以使用缓存一致性?
我有一个关键路径,它在一个线程中执行,固定到一个核心.
我有兴趣确定缓存未命中的位置.环顾四周之后,valgrind的cachegrind工具似乎对我有所帮助.但是,我对此方案中的工具功能有一些疑问:
问题1是最重要的.
任何有关命令行参数的帮助都是最受欢迎的.
c++ ×7
cpu ×3
atomic ×2
inheritance ×2
optimization ×2
performance ×2
x86 ×2
assembly ×1
c ×1
c++11 ×1
caching ×1
concurrency ×1
debugging ×1
gdb ×1
header ×1
java ×1
linux ×1
polymorphism ×1
shared-ptr ×1
unix ×1
valgrind ×1
visual-c++ ×1