我正在阅读那个分支错误预测可能是应用程序性能的热门瓶颈.正如我所看到的,人们经常会显示汇编代码来揭示问题,并指出程序员通常可以预测分支在大多数时间内的位置并避免分支错误预测.
我的问题是:
1-是否可以使用某种高级编程技术(即无汇编)来避免分支错误预测?
2-我应该记住用高级编程语言生成分支友好的代码(我最感兴趣的是C和C++)?
欢迎使用代码示例和基准测试!
std::chrono::time_point::time_since_epoch()返回a duration,参考time_point过去的一些.什么时候是这样的time_point?它取决于C++实现还是由C++标准定义的?或者它是将事件设定为UTC 1970年1月1日的事实上的标准?
使用clang 3.7.1,C++ 14可以很好地编译具有可变参数模板的SFINAE代码:
#include <array>
#include <iostream>
#include <vector>
#include <cstdint>
enum class Bar : uint8_t {
ay, bee, see
};
struct S {
static void foo() {}
// std::begin(h) is defined for h of type H
template<typename H, typename... T>
static typename std::enable_if<std::is_pointer<decltype(std::begin(std::declval<H>()))*>::value>::type
foo(const H&, T&&... t)
{ std::cout << "container\n"; foo(std::forward<T>(t)...); }
// H is integral
template<typename H, typename... T>
static typename std::enable_if<std::is_integral<typename std::remove_reference<H>::type>::value>::type
foo(const H&, T&&... t)
{ std::cout << "integer\n"; foo(std::forward<T>(t)...); }
// H is an …Run Code Online (Sandbox Code Playgroud) v下面的示例代码中的变量是否使用了odr?
extern void* v;
template<void*&>
void f() {}
int main()
{
f<v>();
}
Run Code Online (Sandbox Code Playgroud)
我在Boost ML中发现了这种模式.
比照 http://lists.boost.org/Archives/boost/2011/04/180082.php
它表示boost::enabler永远不会定义,但如果提供选项,clang会将其拒绝为链接错误-g.
比照 http://melpon.org/wandbox/permlink/nF45k7un3rFb175z
上面的示例代码是Boost ML代码的缩减版本,clang也拒绝它.
比照 http://melpon.org/wandbox/permlink/ZwxaygXgUhbi1Cbr
我认为(但我不确定)参考类型的模板非类型参数是odr使用的,即使它们未在模板体中引用,因此Boost ML的模式是错误的.
我的理解是否正确?
我正在调试一个delphi程序.
except
on e: TErrorTapeDrive do
if e.errorCode = 1104 then
if Assigned(indexDoneEvent) then
indexDoneEvent;
// other handling...
// other handling...
end;
Run Code Online (Sandbox Code Playgroud)
我抓住了一个Excetion e并做我需要的事情.现在,当调试程序计数器到达下面的行时end;,如果我e.errorCode用光标悬停,我仍然可以看到它的值.我希望这超出了范围,并最终被摧毁.
所以,我的问题是:我应该在异常处理后释放/销毁异常吗?
为什么编译器无法推导出模板参数std::forward?
我的意思是:
#include <memory>
#include <iostream>
struct X{};
struct A{
A( const X& ) { std::cout << "cpy ctor\n"; }
A( X&& ) { std::cout << "move ctor\n"; }
};
X foo() { return {}; }
template<typename T,typename Arg>
T* factory( Arg&& a )
{
return new T(std::forward(a));
// ----------^^^^^^^^^^^^^^^ error: can't deduce template parameter
}
int main()
{
factory<A>(foo());
}
Run Code Online (Sandbox Code Playgroud)
我知道这是一个设计选择(由于std::remove_reference在定义中std::forward),以避免用户忘记指定类型.我不能得到的是:为什么它的实施方式可以防止扣除?为什么编译器不只是将forward模板参数推断为Arg.
我想用callgrind来描述我的应用程序.现在,由于需要很长时间,同时我继续在同一台机器上进行网页浏览,编译和其他密集型任务.
我是否偏向分析结果?我期待这一点,因为valgrind使用模拟CPU,其他外部进程不应该干扰valgrind执行.我对吗?
此代码使用clang 3.7.1编译(没有诊断)但是使用GCC 5.3.0(实例)失败:
#include <iostream>
template<typename T>
struct A {
void foo()
{
static_cast<T*>(this)->implementation();
}
};
struct Crtp : A<Crtp> {
template<typename T>
friend struct A;
private:
void implementation() { std::cout << "implementation()\n"; }
};
int main()
{
Crtp c;
c.foo();
}
Run Code Online (Sandbox Code Playgroud)
GCC的错误消息如下:
main.cpp:13:16:错误:实例化后朋友struct A的'A'专门化;
哪一个是对的,为什么?这是GCC/clang的错误吗?
在C++中,如果我必须从另一个命名空间调用一个函数,比如说foo,我有两个选择:添加using namespace foo;上面的代码或在执行调用时指定命名空间,即foo::myFunction().
在Delphi中,是否有与第二种替代方案相对应的构造?
我是 Delphi 新手,我发现 Rad Studio XE3 代码编辑器有一些奇怪的行为。
例如,当我按下撤消快捷键 ( Ctrl+Z) 时,编辑器不仅撤消最后的代码编辑,还撤消最新的插入符号移动。我的意思是:当我打开一个单元并浏览其代码时,我会四处单击,而不编辑代码。好吧,如果我按 Ctrl+Z,插入符号将移回到我之前单击过的所有点。Ctrl+Z如果没有执行编辑,我预计当我按 时不会发生任何事情!
有办法取消这个功能吗?
我已经CnWizards_1.0.0.638安装了。
谢谢。