gpt4 book ai didi

c++ - 如果在编译时已知边缘条件,我该如何省略调用?

转载 作者:可可西里 更新时间:2023-11-01 17:42:29 27 4
gpt4 key购买 nike

我遇到以下情况:有大量模板,如 std::vector 将调用 memmove() 来移动数组的各个部分。有时他们会想要“移动”长度为零的部分 - 例如,如果数组尾部被移除(如 std::vector::erase()),他们会想要移动数组的其余部分恰好长度为零,并且该零将在编译时已知(我看到了反汇编 - 编译器知道)但编译器仍会发出 memmove()调用。

所以基本上我可以有一个包装器:

inline void callMemmove( void* dest, const void* source, size_t count )
{
if( count > 0 ) {
memmove( dest, source, count );
}
}

但这会引入额外的运行时检查,以防 count 在我不希望的编译时未知。

是否有可能使用 __assume hint向编译器表明,如果它确定 count 为零,它应该消除 memmove()

最佳答案

__assume 的要点是告诉编译器在优化时跳过部分代码。在您提供的链接中,示例是使用 switch 构造的 default 子句给出的 - 那里的提示告诉编译器永远不会到达该子句,即使理论上它可以.您基本上是在告诉优化器,“嘿,我知道的更多,把这段代码扔掉”。

对于 default 你不能不写它(除非你在 case 中覆盖了整个范围,这有时是有问题的)因为它会导致编译错误。因此,您需要提示来优化您知道不需要的代码。

在您的情况下-代码可以到达,但并非总是如此,因此__assume 提示不会对您有太大帮助。您必须检查 count 是否真的为 0。除非您确定它只能为 0,否则就不要将其写入。

关于c++ - 如果在编译时已知边缘条件,我该如何省略调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7658060/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com