如果我调用一个具有volatile参数的函数,并且该参数未被使用,那么编译器是否必须生成参数?
void consume( volatile int ) { }
...
consume( some_expr );
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会确实对此表示敬意,但我不确定标准中的挥发性措辞是否需要这样做.在我看来,GCC做的是正确的 - 这在逻辑上是对volatile变量的赋值,因此不应该被省略(根据c ++标准的1.9-8)
注意:这样做的目的是防止优化器删除代码评估.也就是说,它some_expr需要进行评估.它允许表达式进行优化,但确保它实际执行.
我已经添加了C和C++作为标签作为答案,如果有任何差异,我会感兴趣.我不认为会有.
答案:我选择了第一个,因为我认为这是标准的正确实际实现.然而,史蒂夫的哲学观点非常有趣,实际上可能意味着标准是模棱两可的.
consume无法读取未命名的参数,因为它未命名.但是,它已初始化,初始化(with some_expr)是一个可见的副作用.因此,编译器可能不会优化初始化输出.
这是否需要实际评估some_expr是另一回事.一般来说,这不是一个可见的副作用,但它可能some_expr包含volatile子表达式.
[编辑]请注意,"未命名"部分可能出现在两个地方.调用者通常无法知道参数是否被命名(更不用说)了.例如
void consume( volatile int x);
consume( some_expr );
// other .cpp
void consume( volatile int ) { } // Same function.
Run Code Online (Sandbox Code Playgroud)