Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 参数检查与函数调用开销_C_Validation_Parameters_Function - Fatal编程技术网

C 参数检查与函数调用开销

C 参数检查与函数调用开销,c,validation,parameters,function,C,Validation,Parameters,Function,我有一个公共函数,需要检查几个参数的有效性,但这个函数也在其他几个地方内部使用,我知道给定的参数将是有效的。因此,我想知道哪一个更昂贵:1)在每个公共函数中保留有效性检查,或2)在公共函数中执行有效性检查,但创建不执行该检查的私有/内部函数(将公共函数用作内部函数的包装器) 函数调用的开销是否权衡了不必执行冗余检查的好处 基本上,我当前的代码将大致如下: boolean foo(int* a, int* b, int* c) { if (!a || !b || !c) { r

我有一个公共函数,需要检查几个参数的有效性,但这个函数也在其他几个地方内部使用,我知道给定的参数将是有效的。因此,我想知道哪一个更昂贵:1)在每个公共函数中保留有效性检查,或2)在公共函数中执行有效性检查,但创建不执行该检查的私有/内部函数(将公共函数用作内部函数的包装器)

函数调用的开销是否权衡了不必执行冗余检查的好处

基本上,我当前的代码将大致如下:

boolean foo(int* a, int* b, int* c)
{
   if (!a || !b || !c) {
       return FALSE;
   }
   <do the whatever foo does here>
}

boolean bar(int* a, int* b, int* c)
{
    if (!a || !b || !c) {
        return FALSE;
    }
    <do the whatever bar does here>
    foo(a, b, c);
 }
boolean foo(int*a,int*b,int*c)
{
如果(!a | | |!b | |!c){
返回FALSE;
}
}
布尔条(int*a、int*b、int*c)
{
如果(!a | | |!b | |!c){
返回FALSE;
}
foo(a、b、c);
}
因此,bar()对a、b和c进行检查,因为它是一个公开/公共函数,但foo会重复相同的检查。允许这种情况发生会更有效吗?或按照以下步骤创建内部函数:

static boolean foo_internal(int* a, int* b, int* c)
{
    <do the whatever foo does here>
}

boolean foo(int* a, int* b, int* c)
{
   if (!a || !b || !c) {
       return FALSE;
   }
   foo_internal();
}

boolean bar(int* a, int* b, int* c)
{
    if (!a || !b || !c) {
        return FALSE;
    }
    <do the whatever bar does here>
    foo_internal(a, b, c);
 }
static boolean foo_internal(int*a,int*b,int*c)
{
}
布尔foo(int*a,int*b,int*c)
{
如果(!a | | |!b | |!c){
返回FALSE;
}
foo_internal();
}
布尔条(int*a、int*b、int*c)
{
如果(!a | | |!b | |!c){
返回FALSE;
}
富奥内部(a、b、c);
}
我主要关心的是C代码的效率,但一般答案/其他语言特有的答案也很有帮助


谢谢

如果检查如您所述,在您真正看到这是一个性能问题之前,我不会做任何事情。这项检查可能会在纳秒内完成,如果不是皮秒

在性能方面,除非有可测量的数据表明使用评测存在性能问题,否则重点应该放在可读和可维护的代码上

在这种情况下,除非参数检查真的很昂贵,否则我认为它是可以接受的。代码表明,其目的是在执行
foo
bar
功能之前进行参数检查


如果
foo
bar
是独立的函数,需要自己调用,那么让检查运行多次可能不是什么大问题。当然,如果参数检查成本太高,并且通过分析显示检查确实占用了大部分时间。

如果您真的关心速度,则始终可以将公共函数内联。但我会确认这确实是一个问题。在C语言中,函数调用非常快,除非在紧循环中调用函数,否则不太可能出现问题


这与python这样的语言非常不同,python的函数调用非常昂贵(至少在cPython上)——在这种情况下,如果速度是一个问题,那么您应该提前考虑API。每个函数调用都有一个开销:存储寄存器、在堆栈上放置参数、,每当它有结果返回它也应该被复制到返回寄存器,可能有更多的细节我忘记了。因此,只需要在参数检查非常、非常、非常昂贵的情况下,才考虑拆分函数,因为只希望避免双参数检查。在C中工作时,可以考虑使用宏来提高可读性。p> 将参数检查保留在foo()中并保持愉快。调用之前,请删除所有冗余检查。当你完成这项工作后,你甚至可以更高兴地重构你的代码:)

我通常建议使用大量的断言。在调试模式下,您可以检查所有内容。更多更好。
发布模式下的错误处理只有在我真正能够发现问题时才会执行。例如,我不会在释放模式下检查缓冲区指针是否为NULL(NULL是无效指针的一个非常小的示例),但如果我的缓冲区受到限制,我会检查缓冲区的大小