C++核心准则:优先使用编译时检查而不是运行时检查

1060 篇文章 295 订阅

原因

代码的清晰度和性能:

  • 你无需为在编译时捕获的错误编写错误处理程序==》代码结构清晰、简洁
  • 编译时检查不会占用执行时间==》性能更好

例子

 // Int is an alias used for integers
    int bits = 0;         // don't: avoidable code
    for(Int i = 0; i ; i <<= 1){
        ++bits;
    }
    if(bits < 32){
        cerr << "Int too small";
    }

这个例子无法达成它想要达成的目标(因为溢出时的行为是无定义的),应该使用static_assert代替

  • 代码目的:通过一个循环的左移操作计算Int的位数,如果小于32为就报错。这是一种运行时检查方式
  • static_assert支持编译时的断言错误
// Int is an alias used for integers
static_assert(sizeof(Int) >= 4);    // do: compile-time check

更好的做法是只使用类型系统并替换Intint32_t

例子:

void read(int* p, int n);   // 将最大n个整数读入*p

int a[100];
read(a, 1000);    // bad, off the end

better:

void read(span<int> r); // 读入整数r的范围

int a[100];
read(a);        // better: 让编译器计算出元素的数量

注:

  • 使用指针传递数据的read可以使用int型的大小信息进行范围检查,但是这种检查只能在执行时进行
  • span包含了数组的尺寸信息,如果数组长度在编译时就可以确定,span就可以实现编译时范围检查。

通过指针传递数据之后,大小信息也作为变量传递,因此之后的范围检查都只能在执行时进行。有了模板类span之后,这些检查都可以重新考虑,看看是否能够变成编译时检查

建议

  • 注意指针类型参数
  • 注意运行时对范围违反的检查

也就是说:编译时能做的,就不要延迟到运行时

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值