历数 C 这些相比 C语言 最爽的特点

结构体定义

C:

typedef struct Vertex {
	int x, y, z;
} Vertex;
Vertex v1 = { 0 };

// or

struct Vertex {
	int x, y, z;
};
struct Vertex v1 = { 0 };

C :

struct Vertex {
	int x, y, z;
};
Vertex v1 = {};

假如你一开始学的C ,再去写C的情况下,你也就会一脸懵逼如何我的结构体编译程序不上。。。

为特殊种类分派堆内存

C:

Vertex* ptr = malloc(sizeof(Vertex) * 10);
free(ptr);

C :

Vertex* ptr = new Vertex[10];
delete[] ptr;

malloc 的主要参数是字节数,因此 得相互配合 sizeof 用。C 的 new 主要参数是数量,全自动依据种类分派相匹配字节数,看上去易读性更强。malloc自始至终回到的是 void*, C 里边 void* 能够 随意变换到其他类型的表针。C 的 new 回到的是特定种类的表针,种类系统软件进更为严苛。

测算固定不动尺寸二维数组的原素数量

C:

Vertex arr[1024];
int arrSize = sizeof(arr) / sizeof(Vertex);

C :

Vertex arr[1024];
int arrSize = std::size(arr);

你当然可以写死 int arrSize = 1024; 但那样也不雅致了,难受了。

RAII

C 语言表达经常会出现 alloc、free 那样用于建立消毁資源的成双涵数,初学者非常容易忘掉启用 free 造成内存泄漏:

Ball* ball = ball_alloc();
// ...

while (ball->isLive) {
// ...
	if (ball->size > 5) {
		return; // 哦豁,完蛋了
	}
}

ball_free(ball);

return;

尤其是各种各样标准分辨里边带 return 的,很有可能有些人感觉在标准里边写 return 那就是你编码设计风格有什么问题,这一就言人人殊了。

C 如果你写好析构函数,那之上难题你也就不用操劳:

class Ball {
public:
	Ball ();
	~Ball ();
}

void foo () {
	Ball ball();
	// ...

	while (ball.isLive) {
	// ...
		if (ball.size > 5) {
			return;
		}
	}

	return;
} // 撤出 foo 涵数以前一定会实行 ~Ball

精确而言,C 自变量完毕生命期的情况下,便会实行它相匹配的析构函数,再实际一点,便是如果你离去一个大括号的范畴时,在这个大括号里边建立的自变量,都是会析构,例如 for while 循环系统里边建立的自变量,或是是 if 句子块里边建立的自变量全是那样的,或是索性你自己在中间写一个大括号:

int main () {
	{
		Ball ball;
		printf("");
	} // 这儿 ball 会析构

	return 0;
}

遗憾 C 不可以从句子块回到一个值,rust 就会有这一非常好的特点。

引入

引入用的好,表针不用,如果你用引入能够 解决困难的情况下,就不要用表针。引入不会有野指针这类状况,他的功效范畴更为严苛。对引入实际操作,便是对本身实际操作,也不用和表针一样用 ->,立即 . 就行。表针种类的自变量必须存储空间来储存一个内存地址,而引入仅仅一个别称,不用室内空间储存内存地址。针对 a.b.c.d 那样一长串的关系式,用引入会更舒适(auto& d = a.b.c.d)。

rust语言表达里边自变量使用权定义,便是对C 引入扩展罢了。

动态数组 vector

前边讲了 C 的 new 是个好产品,可是 vector 更强。vector 自身有析构函数,生命期完毕全自动启用里边每一个目标的析构函数,因此 无需像 new 一样必须 delete。一般 C语言涵数 传到一个二维数组,一般必须另外传到数组指针和二维数组尺寸,可是 C 你能立即把 vector 当主要参数传到,自身就可以启用 size() 获得尺寸。

C:

void foo (Vertex* arr, int size) {
// ...
}

C :

void foo (vector<Vertex>& arr) {
// ...
}

C 能够 随意选择传引入或是传值,C语言只有传表针。就算你一直在主要参数写上 Vertex arr[10],你觉得他就能传值了?不对,如果你想要 sizeof (arr) 获得二维数组大钟头,它回到的是表针的尺寸,因此 这就表明传进去的或是表针。

一样的大道理,如果你想回到二维数组,在涵数回到种类写上 Vertex[10] 的情况下,也是不好的,沒有那样的书写,就算是固定不动尺寸的二维数组都不好。因此 许多 C API 必须回到二维数组的情况下该怎么办?回答便是,你先自身分派好运行内存,再把表针传进来,他载入內容。那假如你也不知道数组长度是多少该怎么办,那一般会有一个API承担能够 回到尺寸。

C 就痛快多了,你立即回到你一直在涵数里边建立的 vector 就可以了,c语言编译器会很暖心把这个自变量的生命期迁移给入参,不容易产生一切附加拷贝。

C:

{
	int size = GetSize();
	Ball* balls = malloc(sizeof(Ball) * size);
	GetBalls(balls, size);
	free(balls);
}

C :

{
	vector<Ball> balls = GetBalls();
	// 爽爽爽
}

正确了,vector<bool> 请慎重应用

评论(0条)

刀客源码 游客评论