当前位置: 首页 > 知识库问答 >
问题:

仅返回输入参数的C函数

许奇
2023-03-14

出于我无法控制的原因,我必须在我的C代码中实现这个函数:

double simple_round(double u)
{
    return u;
}

调用此函数时,编译器是否忽略它,或者是否仍然进行调用?例如:

int y;
double u = 3.3;

y = (int)simple_round(u*5.5); //line1
y = (int)u*5.5;               //line2

两行代码的执行时间是相同的,还是第一行需要更长的时间?

共有3个答案

艾骏喆
2023-03-14

如果无论如何都必须编译“生成”的代码,也许您可以“混搭”一个宏Macro,它重新定义对该代码所做的“低效”舍入函数的调用

这是一个概念(都在一个文件中)。也许#定义可以“shimmed in”(并记录!)到该单个源文件的makefile条目中。

int fnc1( int x ) { return 5 * x; }

void main( void ) {
    printf( "%d\n", fnc1( 5 ) );

#define fnc1(x) (x)

    printf( "%d\n", fnc1( 7 ) );
}

输出:

25
7
百里君博
2023-03-14

调用此函数时,编译器是否忽略它,或者是否仍然进行调用?

视情况而定。如果函数定义在相同的*中。c文件作为它被调用的地方,然后编译器很可能会自动内联它,因为它有一些内联非常简单的函数或只调用一次的函数的标准。当然,您必须指定足够高的优化级别

但是如果函数定义在另一个编译单元中,编译器就无能为力,除非你使用链接时优化(LTO)。那是因为在C each *中。c文件是一个单独的编译单元,将被编译成一个单独的对象(*。o)文件和编译器不知道其他编译单元中的函数体。只有在链接阶段,未解析的标识符才会被其他编译单元的信息填充

在本例中,生成的代码位于*中。c文件调用一个可以在另一个文件中更改的函数。c文件则有许多更可靠的解决方案

>

  • 最正确的方法是修理发电机。提供证据证明生成的代码调用的函数很糟糕并修复它

    如果您真的没有办法修复生成器,那么一种可能的方法是删除生成的*。编译列表中的c文件(即不再将其编译为*.o),并将其包含在您自己的*中。c文件

    #define simple_round(x) (x)
    #include "generated.c"
    #undef simple_round
    

    现在,生成的 simple_round() 调用将被替换为任何内容

  • 朱昊乾
    2023-03-14

    因为函数是在与使用它的地方不同的C文件中定义的,如果你不使用链接时优化,当编译器调用函数调用时,它不知道函数做什么,所以它必须实际编译函数调用。该函数可能只有两条指令:将参数复制到返回值,然后返回。

    额外的函数调用可能会也可能不会减慢程序,具体取决于CPU的类型和CPU正在做的其他事情(附近的其他指令)

    它还会迫使编译器考虑它可能正在调用一个非常复杂的函数,该函数会覆盖许多寄存器(无论哪一个寄存器都允许被函数调用覆盖);这将使调用它的函数中的寄存器分配变得更糟,可能会使该函数更长,并需要进行更多的内存访问。

     类似资料:
    • 问题内容: 如果我有 我有: 然后,我可以成功执行以下操作: 但是,假设我要在doSomething中添加另一个参数,例如: 如果我这样称呼,Go在编译时会抱怨: 带有: 有没有办法做到这一点,还是我应该放弃并将返回值分配给某些引用,并将msg和这些值传递给? 问题答案: 在规范中对此进行了描述。它要求内部函数返回所有参数的正确类型。没有多余的参数以及返回多个值的函数。 作为一种特殊情况,如果一个

    • 出于某种原因,在下面的递归函数中, 永远不递增p,也就是说字符串s永远不是一个回文,尽管在我的程序中,s确实是一个回文,次数相当少。但是在下面一行中它仍然返回false 是因为功能吗?s采用的一些值为:aaa、aba、AAAA、abbb、bab 我已确保s中没有前后空格 P、 S:我已经检查过了,x==n 示例输入: 输出0。回文:aaaaaa、abaaba、aaaaaa

    • C++ 数组 C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并

    • 函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。 return 语句的一般形式为: 或者: 有没有 都是正确的,为了简明,一般也不写 。例如: 对C语言返回值的说明: 1) 没有返回值的函数为空类型,用 表示。例如: 一旦函数的返回值类型被定义为 void,就不能再接收它的值了。例如,下面的语句是错误的: 为了使程序有良好的可读性并减少出错,

    • 函数能够接收参数供自己使用,也可以返回零个或多个值(我们通常把返回多个值称为返回一组值)。相比与 C、C++、Java 和 C#,多值返回是 Go 的一大特性,为我们判断一个函数是否正常执行(参考 第 5.2 节)提供了方便。 我们通过 return 关键字返回一组值。事实上,任何一个有返回值(单个或多个)的函数都必须以 return 或 panic(参考 第 13 章)结尾。 在函数块里面,re

    • 我有一个这样的方法,它通常用于返回。 在最后一行,我从Pylance那里得到了以下信息: (方法)is_file:()- 有没有一种方法可以正确地键入提示这种情况,以便Pylance知道是?或者我应该让它总是返回路径,并有另一个方法调用将输出转换为字符串,然后返回? 谢谢 编辑1 我刚刚意识到另一个更常见的场景: 在熊猫中,输入参数可以改变输出类型,Pylance也不能处理这个问题。Pylance