gpt4 book ai didi

c - 是否允许 C 编译器优化掉未使用的函数参数?

转载 作者:太空宇宙 更新时间:2023-11-04 05:48:13 24 4
gpt4 key购买 nike

我知道如何将参数传递给函数不是 C 标准的一部分,它取决于硬件架构和调用约定。

我还知道优化编译器可能会自动内联函数以节省调用开销,并省略没有“副作用”的代码。

但是,我有一个关于具体案例的问题:
假设有一个重要的函数不能被内联或删除,并且必须被调用,它被声明为不带参数:

int veryImportantFunc() {
/* do some important stuff */

return result;
}

但是这个函数是用参数调用的:

int result = veryImportantFunc(1, 2, 3);

是否允许编译器在不传递这些参数的情况下调用函数?

或者是否有一些标准或技术限制会阻止这种优化?

此外,如果参数评估有副作用怎么办:

int counter = 1;
int result = veryImportantFunc(1, ++counter, 3);

编译器是否有义务在不传递结果的情况下进行评估,或者放弃评估而留下 counter == 1 是否合法?

最后,额外的参数呢:

char* anotherFunc(int answer) {
/* Do stuff */

return question;
}

如果这个函数是这样调用的:

char* question = anotherFunc(42, 1);

编译器可以根据函数声明去掉 1 吗?

编辑:澄清一下:我无意编写示例中的那种代码,而且我在我正在处理的任何代码中都没有发现这种代码。
这个问题是为了了解编译器是如何工作的以及相关标准是怎么说的,所以对于所有建议我远离这种代码的人:谢谢,但我已经知道了。

最佳答案

首先,“声明不接受参数”是错误的。 int veryImportantFunc() 是一个接受任何参数的函数。这是过时的 C 风格,不应使用。对于不带参数的函数,使用 (void)

Is the compiler allowed to call the function without passing these arguments?

如果实际函数定义与参数数量不匹配,则行为未定义。

Also, what if argument evaluation has side effects

没关系,因为在调用函数之前会计算参数(以未指定的顺序)。

Is the compiler obligated to evaluate even without passing the result, or would it be legal to drop the evaluation leaving counter == 1?

它将评估参数然后调用未定义的行为。任何事情都有可能发生。

And finally, what about extra arguments:

您的示例无法编译,因为它不是有效的 C。

关于c - 是否允许 C 编译器优化掉未使用的函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53810517/

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