C++传值与传地址

#include<stdio.h>
struct Object 
{
    int id;
    char name[256];
};

//传值方式
void Text1(Object a)
{
    printf("id: %d,name: %s", a.id, a.name);
}

//传地址方式
void Text2(Object* a)
{
    printf("id: %d,name: %s", a->id, a->name);
}

int main()
{
    Object obj = { 123, "zhangsan" };
    Text1(obj);
    Text2(&obj);
    return 0;
}

1.传值方式

 函数的形参是传入的实参的一份拷贝,形参是函数的局部变量,只在函数内部有效。
 在函数Text1被调用时,有两个Object对象,其中一个叫obj,定义在main函数里,另一个叫a,是函数Test1里的局部变量。
 在传值调用时,讲obj的值赋给了变量a.相当于:
 Object a = obj;
 因此说,对象a是obj的一个拷贝,下面分析这一部操作的资源消耗:
 (1)从内存资源消耗上看(空间角度),对象a耗费260个字节的内存。
 (2)从CPU资源的耗费上看(时间角度),从对象obj到对象a需要复制260个字节。

2.传地址方式

  在函数Text2被调用时,传入一个对象obj的地址,既有一个Object*指针来表示对象obj的地址
  Object *p = &obj;
  下面分析这一部操作的资源消耗:
  (1)从内存资源消耗上看(空间角度),指针p占据4个字节,所有的指针其实只是一个整数(表示内存地址)
  (2)从CPU资源的耗费上看(时间角度),不需要复制数据,只需传递一个整数地址。

通过比较发现,传地址方式在性能上远远优于传值方式,它使用了较少的资源完成了相同的事情。在内存上,传地址方式使用了较少的内存,在CPU消耗上,传地址方式耗费的CPU操作也非常少。
所以在C/C++里,当一个对象的体积较大时(结构体。数组),总是使用传地址方式来传递参数



指针变量为什么占4个(8个)字节?

. cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推。32位操作系统针对的32位的CPU设计。64位操作系统针对的64位的CPU设计。操作系统只是硬件和应用软件中间的一个平台。我们的CPU从原来的8位,16位,到现在的32位和64位。

# include<stdio.h>
int main(void)
{
int i = 373;
double j = 4.5;
char ch = ‘A’;

int * p = &i;
double * q = &j;
char * r = &ch;

printf(“%d %d %d\n”,sizeof(p), sizeof(q), sizeof(r));
return 0;
}

运行结果是 4 4 4

指针不同于一般变量,存的是变量的地址,在同一架构下地址长度都是相同的(cpu的最大寻址内存空间),所以不同类型的指针长度都一样,输出的4 4 4,说明指针长度为4字节,可以记录的地址范围是0x00000000~0xFFFFFFFF,这个范围才是指针变量的值。比如说一个char 1字节,可以存在0x0,也可以位于0xFFFFFFFF,而和char占用1字节还是100字节无关,*指针的范围只和机器字和系统有关比如你的32位系统,指针长度为4,在64位操作系统下那么就都是8了。

猜你喜欢

转载自blog.csdn.net/yulong_abc/article/details/81676696