我遇到过一些场景,我想说函数的返回值可能在函数体内,而不是调用它的 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 谓词几乎总是假的。据我所知,没有办法用属性来表达,但如果分支权重信息可以通过函数传播,这是一个已解决的问题。
到目前为止,我还没有找到关于这个的文档,我不知道通过查看输出的程序集来测试这个的好设置。
内存是std::array连续的吗?以下是有效/良好的做法吗?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
Run Code Online (Sandbox Code Playgroud)
我可以传递ptr给期望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.谢谢大家的答案.