小编Ael*_*ian的帖子

BOOST_LIKELY和__builtin_expect仍然相关吗?

我理解这里解释的内容以及这些内容包括CPU对静态分支预测的提示.

我想知道英特尔CPU上的这些是如何相关的,因为英特尔CPU已经放弃了对这里提到的静态预测提示的支持.此外,如果我理解它现在如何工作,路径中的分支指令的数量将是编译器可以控制的唯一事物,并且在运行时决定预测,获取和解码哪个分支路径.

鉴于此,是否存在代码中的分支提示对于针对最近的英特尔处理器的软件仍然有用的情况,可能使用条件返回或者在嵌套的if/else语句的情况下避免关键路径中的分支指令数量?

此外,如果这些仍然相关,那么gcc和其他流行编译器的任何细节都会受到赞赏.

PS我不是为了过早优化或者用这些宏来编写代码,但是我对这个主题很感兴趣,因为我正在使用一些时间关键代码,并且仍然希望尽可能减少代码混乱.

谢谢

assembly gcc boost intel

9
推荐指数
1
解决办法
1361
查看次数

在O(n)时间内更新C#键控集合中的所有值?

这是我在C#中一次又一次遇到的问题,但还没有找到一般解决方案.在C++/STL中,可以使用迭代器在O(n)时间内更新映射中的所有值,而无需使用键来访问每个元素.有没有办法获得与任何C#集合类似的行为,如SortedList,SortedDictionary?

我可以做点什么

foreach (int key in list.Keys)
{
    list[key] *= 3;
}
Run Code Online (Sandbox Code Playgroud)

但是这需要O(n*log(n))作为搜索每个元素使用key取log(n).

只是为了提出一个想法,我正在寻找以下内容:

SortedList<int, double> list = new SortedList<int,double>();

// Add few values fist

// E.g. first try ...
IList<double> values = list.Values;
for (int i = 0; i < values.Count; i++)
{
    values[i] *= 3;
}

// E.g. second try
foreach (KeyValuePair<int, double> kv in list)
{
    kv.Value *= 3;
}
Run Code Online (Sandbox Code Playgroud)

由于List已经排序,因此应该可以遍历它同时更新值(而不是键).从实现的角度来看,它看起来并不存在问题,但由于某种原因,似乎没有提供功能.

此外,这不是一个简单的情况,因为可以使用相同的方法从已知位置迭代到该范围内的另一个修改值.

有没有办法在C#中使用.NET中的任何键控集合而不使用第三方库?

谢谢

占道

.net c# collections

5
推荐指数
1
解决办法
633
查看次数

如何卸载使用ngen生成的旧的.net本机映像而不匹配IL程序集?

在应用程序开发过程中,我一直在运行"ngen install ...".但是在这些程序集被覆盖之前,没有在某些版本/方案(调试等)上运行"ngen uninstall ...".现在,我在"C:\ Windows\assembly\NativeImages_v4.0.30319_64\AssemblyName\hashkey"格式的文件夹中看到许多*.ni.exe和*.ni.dll.(dll也是内部开发的.)

我正在使用.Net 4.

反正有没有卸载这些?我试过"ngen update"它似乎没有触及这些孤立的原生图像.当然我可以手动删除它们,但它会扰乱我的程序集所依赖的系统dll上的引用计数,或者对.net系统造成更糟糕的后果.

除了占用空间之外,这些较旧的程序集会损害启动延迟,因为程序集绑定程序试图将当前IL与每个本机程序集进行匹配.

还有一种更好的方法来查看本机映像缓存中的内容而不是使用命令行吗?

谢谢

.net ngen .net-4.0 .net-assembly

5
推荐指数
2
解决办法
6372
查看次数

如何"帮助"编译器从模板参数中推导出函数模板返回类型?

要从strtoxx调用中去除代码,但仍然将它们内联,我希望有一个函数模板,如:

template <typename STR_TO_NUM> static auto StrToNum( const string& s ) {
    char* pEnd;
    return STR_TO_NUM( s.c_str(), &pEnd, 10 );
}
Run Code Online (Sandbox Code Playgroud)

并称之为

unsigned long x = StrToNum<strtoul>( "1984" );
Run Code Online (Sandbox Code Playgroud)

但是我得到'模板参数推断/替换失败:'错误.我可以:

template <typename T, T (*STR_TO_NUM)(const char *, char **, int)> static T StrToNum( const string& s ) {
    char* pEnd;
    return STR_TO_NUM( s.c_str(), &pEnd, 10 );
}
Run Code Online (Sandbox Code Playgroud)

并在调用时指定返回类型.但感觉这是多余的.有没有办法避免它?

我试图在C++ 11中使用'using'来'模板typedef'STR_TO_NUM,但是无法弄清楚如何为函数类型做到这一点.

谢谢

c++ templates c++11 argument-deduction

0
推荐指数
1
解决办法
69
查看次数