C++中指针函数参数的复制与性能

C++中指针函数参数的复制与性能,c++,pointers,C++,Pointers,第一个问题: 很多时候,我们通过使用指针的函数调用将一个对象的引用传递给另一个对象。例如: int num =25; int *num1Ptr=# int *num2Ptr=NULL; void assinNum (int *numPtr){ num2Ptr = numPtr; ////we copy the value (address) of the num1Ptr pointer to num2Ptr } 我的问题是:如果这样一个方法被频繁调用,我们能期望大量

第一个问题:

很多时候,我们通过使用指针的函数调用将一个对象的引用传递给另一个对象。例如:

int num =25;
int *num1Ptr=#
int *num2Ptr=NULL;

void assinNum (int *numPtr){

    num2Ptr = numPtr; ////we copy the value (address) of the num1Ptr pointer to num2Ptr
}
我的问题是:如果这样一个方法被频繁调用,我们能期望大量的指针复制开销吗

第二个问题:

在下面的场景中,这是否意味着我们将传递的numPtr指向的内存地址中的值复制到num2Ptr指向的内存地址?如果是,则与通过值传递相同

int num =25;
int *num1Ptr=#
int *num2Ptr=NULL;

void assinNum (int *numPtr){

    *num2Ptr = *numPtr; ////num2Ptr points to the same value in the memory pointed by numPtr argument. 
}
第一个问题的最新情况:

指向大型对象而非原语的指针的后果是什么

如果这样一个方法被频繁调用,我们能期望大量的指针复制开销吗

指针通常只是32位或64位的量。因此,复制指针只需要复制32位或64位数量,这在大多数平台上都非常便宜。然而,直接复制int也非常便宜,因此在这种情况下,使用指针可能不会给您带来太多好处

还值得指出的是,在许多情况下,编译器将通过内联来优化此函数

这是否意味着我们将传递的numPtr指向的内存地址中的值复制到num2Ptr指向的内存地址

理论上,是的。但是,num2Ptr=NULL,因此您的代码可能会导致分段错误

那么它和传递值一样吗

我不确定你指的是什么,所以很难知道如何回答这个问题

如果这样一个方法被频繁调用,我们能期望大量的指针复制开销吗

指针通常只是32位或64位的量。因此,复制指针只需要复制32位或64位数量,这在大多数平台上都非常便宜。然而,直接复制int也非常便宜,因此在这种情况下,使用指针可能不会给您带来太多好处

还值得指出的是,在许多情况下,编译器将通过内联来优化此函数

这是否意味着我们将传递的numPtr指向的内存地址中的值复制到num2Ptr指向的内存地址

理论上,是的。但是,num2Ptr=NULL,因此您的代码可能会导致分段错误

那么它和传递值一样吗

我不确定你指的是什么,所以很难知道如何回答这个问题

我的问题是:如果这样一个方法被频繁调用,我们能期望大量的指针复制开销吗

用于复制sizeofint*?不会。但是,对于函数调用,可能会有很大的开销,特别是如果调用是通过PLT执行的。在多线程环境中,这会间接引入其他开销

在下面的场景中,这是否意味着我们将传递的numPtr指向的内存地址中的值复制到num2Ptr指向的内存地址

如果是,则与通过值传递相同

不可以。通过值传递整数的速度更快,主要是因为通过值传递不涉及读取内存,而是通过寄存器来完成

我的问题是:如果这样一个方法被频繁调用,我们能期望大量的指针复制开销吗

用于复制sizeofint*?不会。但是,对于函数调用,可能会有很大的开销,特别是如果调用是通过PLT执行的。在多线程环境中,这会间接引入其他开销

在下面的场景中,这是否意味着我们将传递的numPtr指向的内存地址中的值复制到num2Ptr指向的内存地址

如果是,则与通过值传递相同


不可以。按值传递整数的速度更快,主要是因为按值传递不涉及读取内存,而是通过寄存器完成。

指针复制成本非常低,但对于指针大小与存储数据一样大或更大的原始数据类型来说,这没有什么意义


对于第二个问题,您要处理的是值,与按值处理相同。

指针复制的成本非常低,但对于指针大小与存储数据一样大或更大的原始数据类型来说,这没有什么意义

对于你的第二个问题,你是在应对价值,这与按价值应对是一样的

如果这样一个方法被频繁调用,我们能期望大量的指针复制开销吗

开销意味着您正在将一些可选的或虚假的工作量与实际需要完成的工作量进行比较,以达到特定的预期效果。总工作量和最低要求工作量之间的差异是间接费用。在这种情况下,不清楚您的基线是什么。你会考虑什么开销?将一个指针复制到另一个指针的操作非常复杂 mall-这只是一个32位或64位的分配,取决于您的目标平台。这样的手术不是免费的,但速度很快

传递的numPtr指向的内存地址到num2Ptr指向的内存地址

是的,您显示的代码将numPtr引用的内存中的值复制到numPtr2引用的内存中。当然,在您的示例中,指针分别引用地址0x00000019和0x00000000,因此在读取源值时会崩溃,除非您知道那里有可读内存;在写的时候崩溃,除非你知道你也有可写的内存,而且你可能没有。请注意,您的注释///num2Ptr指向numPtr参数所指向的内存中的相同值。这是不正确的

如果是,则与通过值传递相同

int num =25;
int *num1Ptr=#
int *num2Ptr=NULL;

void assinNum (int *numPtr){

    *num2Ptr = *numPtr; ////num2Ptr points to the same value in the memory pointed by numPtr argument. 
}
传递指针与传递值不同。指针是对数据的引用,而不是数据的值。当然,指针本身是按值传递的,但您需要取消对它的引用。由于指针是可写的,您可以对其进行写入,调用者将在其返回时看到这种写入的效果

如果这样一个方法被频繁调用,我们能期望大量的指针复制开销吗

开销意味着您正在将一些可选的或虚假的工作量与实际需要完成的工作量进行比较,以达到特定的预期效果。总工作量和最低要求工作量之间的差异是间接费用。在这种情况下,不清楚您的基线是什么。你会考虑什么开销?将一个指针复制到另一个指针的操作非常小——这只是一个32位或64位的赋值,具体取决于您的目标平台。这样的手术不是免费的,但速度很快

传递的numPtr指向的内存地址到num2Ptr指向的内存地址

是的,您显示的代码将numPtr引用的内存中的值复制到numPtr2引用的内存中。当然,在您的示例中,指针分别引用地址0x00000019和0x00000000,因此在读取源值时会崩溃,除非您知道那里有可读内存;在写的时候崩溃,除非你知道你也有可写的内存,而且你可能没有。请注意,您的注释///num2Ptr指向numPtr参数所指向的内存中的相同值。这是不正确的

如果是,则与通过值传递相同

int num =25;
int *num1Ptr=#
int *num2Ptr=NULL;

void assinNum (int *numPtr){

    *num2Ptr = *numPtr; ////num2Ptr points to the same value in the memory pointed by numPtr argument. 
}

传递指针与传递值不同。指针是对数据的引用,而不是数据的值。当然,指针本身是按值传递的,但您需要取消对它的引用。由于指针是可写的,您可以对其进行写入,调用者将在其返回时看到这种写入的效果。

嗯,这是一种伪代码…:这是一种伪代码…:你能在回答中提到优化器吗?他正在处理一个函数,其主体是示例代码中的一个赋值;几乎每一个编译器都会将其内联,然后很可能会删除所有指针位,这使得这个特定的示例变得毫无意义。你的答案的其余部分非常适合一般情况。你能在你的答案中提到优化器吗?他正在处理一个函数,其主体是示例代码中的一个赋值;几乎每一个编译器都会将其内联,然后很可能会删除所有指针位,这使得这个特定的示例变得毫无意义。你剩下的答案非常适合一般情况。