[英]Are there any performance implications of passing a Python tuple in place of a C++ struct function argument?
[英]In terms of function parameter passing, is there any “mutable” type in C++ as there is in python
Python 使用按引用调用系统: 如果您将 arguments 之类的整数、字符串或元组(又名“可变”类型)传递给 ZC1C425268E68385D1AB5074C1,因为您不能更改调用-按-F值传递给 function 的不可变对象的值。 而传递可变对象可以被视为通过引用调用,因为当它们的值在 function 内部发生更改时,它也会在 function 外部反映。 如果我们在这个引用调用系统的背景下定义“可变”,那么 C++ 中是否有任何“可变”类型? 换句话说,当传递到按值调用 function 时,是否有任何类型的值变化将反映在 function 之外?
还有一个附带问题:为什么 python 使用引用调用系统? 乍一看,似乎 python 中的可变类型可能会导致并发问题。
No 和 Yes,在 C++ 中略有不同。
在 c++ 中,可变允许修改声明为可变的 class 成员,即使包含的 object 声明为 const。 在这里,我们可以更改 class 变量名称,即使我们已经创建了常量 object。
您在 python 中引用的那个在 C++ 中是不可能的,按值传递的变量永远不能更改从调用的 function 传递的变量。
考虑这个例子
#include <iostream>
#include <string.h>
using namespace std;
class A {
public:
mutable string name;
int val;
A(string s, int a)
{
name= s;
val = a;
}
void changename(string p) const
{
name=p;
}
void display() const
{
cout << " name is: " << name << endl;
cout << "Age is: "
<< val << endl;
}
};
int main()
{
const A c1("Mouse", 3);
c1.display();
c1.changename("Internet");
c1.display();
std::cout<<c1.name;
}
好吧,在 C++ 中,传递事物和变异是明确的。 如果你想传递一个允许其变异的变量,你可以通过引用/指针或地址传递它。 如果您不希望指针或 ref 发生突变,您可以通过值传递或使您的 function 参数const
。 这是一个例子:
//d is passed by reference so its value could be changed.
void mutate(int* d) {
*d = 0; //OK
}
void mutate(int& d) {
d = 0; // OK
}
// pass by value i.e object is copied.
void no_mutate(int d) {
d = 0; //OK. but d is copied so no effect on the original variable passed.
}
void no_mutate(const int * d) {
*d = 0; // Compiler error. d is a const pointer. Can't change it's value.
}
void no_mutate(const int& d) {
d = 0; // Compiler error. d is a const ref. Can't change it's value.
}
注意:如果您传递具有指针属性的对象,则可能/不能改变取决于您如何定义复制/移动构造函数。
关于并发,无论如何,如果你想防止竞争条件,你必须使用某种锁或互斥锁。 Python 和 C++ 都具有这些并发特性。
Python 在任何地方都使用按引用调用,非可变类型提供接近按值调用的东西。
C++更多低级明确的。 您可以按值(传递变量)、按引用(传递引用)或按地址(传递指针)传递变量。 如果您按值传递某些内容,则被调用者将始终获得原始 object 的(默认情况下浅)副本。 这意味着如果传递的 object 包含自身的指针引用,则引用或指针的副本仍将指向原始 object 指向的相同元素。 但是在这里,由于类可以包含复制构造函数或赋值运算符的自定义版本,class 设计器可以选择复制的浅或深。
TL/DR:在 python 中,该语言说变量是通过引用传递的。 在 C++ 中,一切都是按值传递的,但程序员可以决定传递值(并依赖于完成复制)或传递显式引用或指针。
对于附加问题,Python 使用引用调用来提高效率。 复制引用只是一个地址(通常为 32 或 64 位),而按值传递需要完整的 object 的副本,该副本可能很大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.