摘要
C语言的最爽特点:简洁明了,结构体定义更方便。typedef struct Vertex Vertex;或struct Vertex ;都可以定义结构体,让我们的代码更加优美。
正文
历数 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