小编Ril*_*ley的帖子

分支似然提示是否通过函数调用进行?

我遇到过一些场景,我想说函数的返回值可能在函数体内,而不是调用它的 if 语句。

例如,假设我想将代码从使用LIKELY宏移植到使用新[[likely]]注释。但这些在句法上不同的地方:

#define LIKELY(...) __builtin_expect(!!(__VA_ARGS__),0)
if(LIKELY(x)) { ... } 
Run Code Online (Sandbox Code Playgroud)

对比

if(x) [[likely]] { ... }
Run Code Online (Sandbox Code Playgroud)

没有简单的方法可以重新定义LIKELY宏以使用注释。会定义一个函数

inline bool likely(bool x) { 
  if(x) [[likely]] return true;
  else return false;
}
Run Code Online (Sandbox Code Playgroud)

将提示传播到if?像

if(likely(x)) { ... }
Run Code Online (Sandbox Code Playgroud)

类似地,在通用代码中,很难在实际if语句中直接表达算法似然信息,即使该信息在其他地方是已知的。例如,a copy_ifwhere 谓词几乎总是假的。据我所知,没有办法用属性来表达,但如果分支权重信息可以通过函数传播,这是一个已解决的问题。

到目前为止,我还没有找到关于这个的文档,我不知道通过查看输出的程序集来测试这个的好设置。

c++ compiler-optimization branch-prediction c++20

21
推荐指数
2
解决办法
770
查看次数

std :: array中的内存是连续的吗?

内存是std::array连续的吗?以下是有效/良好的做法吗?

std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
Run Code Online (Sandbox Code Playgroud)

我可以传递ptr给期望c风格数组的函数吗?

c++ arrays pointers contiguous c++11

17
推荐指数
1
解决办法
6723
查看次数

C++宏确保释放已用内存?

所以我有点像n00b并且正在阅读关于new,delete和指针,我确信在我的生命中我会忘记太多的删除.所以我想知道像下面的宏是否会比它的价值更麻烦.

#define withObject(ptr, value, BODY)                       \
{                                                           \
     ptr = value;                                           \
     BODY                                                   \
     delete ptr;                                            \ 
     ptr=NULL                                               \
}
Run Code Online (Sandbox Code Playgroud)

这个宏会导致一些问题或以意想不到的方式表现吗?

编辑:oops我离开了d on freed.谢谢大家的答案.

c++ macros memory-leaks memory-management

6
推荐指数
2
解决办法
805
查看次数