C++核心准则SL.con.4:不要对不能直接拷贝的参数使用memset或memcpy
SL.con.4: don't use memset or memcpy for arguments that are not trivially-copyable
SL.con.4:不要对不能直接拷贝的参数使用memset或memcpy
Reason(原因)
Doing so messes the semantics of the objects (e.g., by overwriting a vptr).
这样做会搞乱对象的语义(例如覆盖虚函数指针)。
Note(注意)
Similarly for (w)memset, (w)memcpy, (w)memmove, and (w)memcmp
(w)memset, (w)memcpy, (w)memmove, and (w)memcmp的情况也类似。
Example(示例)
struct base {virtual void update() = 0;
};struct derived : public base {void update() override {}
};void f(derived& a, derived& b) // goodbye v-tables
{memset(&a, 0, sizeof(derived));memcpy(&a, &b, sizeof(derived));memcmp(&a, &b, sizeof(derived));
}
Instead, define proper default initialization, copy, and comparison functions
正确的方法是定义适当的默认初始化,拷贝和比较函数
void g(derived& a, derived& b)
{a = {}; // default initializeb = a; // copyif (a == b) do_something(a, b);
}
Enforcement(实施建议)
Flag the use of those functions for types that are not trivially copyable
标记使用针对不可简单复制的类型使用上述函数的情况。
TODO Notes(待办记录):
Impact on the standard library will require close coordination with WG21, if only to ensure compatibility even if never standardized.
对标准库的冲击要求和WG21进行紧密合作,如果只确保兼容性,恐怕永远也无法标准化。
We are considering specifying bounds-safe overloads for stdlib (especially C stdlib) functions like memcmp and shipping them in the GSL.
我们正在考虑为类似memcmp的stdlib(特别是C标准库)函数定义重载版本并发布到GSL中。
For existing stdlib functions and types like vector that are not fully bounds-checked, the goal is for these features to be bounds-checked when called from code with the bounds profile on, and unchecked when called from legacy code, possibly using contracts (concurrently being proposed by several WG21 members).
对于存在的没有完全进行边界检查的标准库函数和类型,例如vector,目标是被边界准则群组有效的代码调用时可以进行边界检查,被历史代码调用时不检查。实现方式有可能是使用契约(同时被多位WG21成员建议)
原文链接
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#slcon4-dont-use-memset-or-memcpy-for-arguments-that-are-not-trivially-copyable
新书介绍
《实战Python设计模式》是作者最近出版的新书,拜托多多关注!
本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。
对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
觉得本文有帮助?请分享给更多人。
关注微信公众号【面向对象思考】轻松学习每一天!
面向对象开发,面向对象思考!
C++核心准则SL.con.4:不要对不能直接拷贝的参数使用memset或memcpy相关推荐
- php 语法 条件变量,C ++核心准则:注意条件变量的陷阱
今天,我写了一篇关于条件变量的恐怖文章.您应该意识到条件变量的这一问题.C ++核心准则CP 42仅声明:"不要无条件等待". 等待!条件变量支持一个非常简单的概念.一个线程准备一 ...
- modbus软件开发实战指南_C++核心准则?GSL:指南支持库
GSL: Guidelines support library GSL:指南支持库 The GSL is a small library of facilities designed to suppo ...
- 开源压缩算法brotli_Google的Brotli压缩算法,C ++核心准则以及更多新闻
开源压缩算法brotli 在本周的开源新闻综述中,我们将介绍Google的Brotli压缩算法,适用于GitHub的Classroom,C ++ Core Guidelines等! 2015年9月20 ...
- C++核心准则C.4:只有直接访问表达的函数,才应该成为成员
C.4: Make a function a member only if it needs direct access to the representation of a class C.4:只有 ...
- C++核心准则ES.56:只在需要将一个对象显式移动到另外的作用域时使用std::move
ES.56: Write std::move() only when you need to explicitly move an object to another scope ES.56:只在需要 ...
- C++核心准则NL:命名和布局规则
NL: Naming and layout rules NL:命名和布局规则 Consistent naming and layout are helpful. If for no other rea ...
- C++核心准则边译边学-目标之外
In.not: Non-aims(目标之外) The rules are not intended to be minimal or orthogonal. In particular, genera ...
- C++核心准则ES.40:避免复杂的表达式
ES.40: Avoid complicated expressions ES.40:避免复杂的表达式 Reason(原因) Complicated expressions are error-pro ...
- C++核心准则ES.30: 不要使用宏进行程序中的文本操作
ES.30: Don't use macros for program text manipulation ES.30: 不要使用宏进行程序中的文本操作 Reason(原因) Macros are a ...
最新文章
- 周志华讲座---关于人工智能---科普性质---天地工学讲坛2017.11.30
- Make it Divisible by 25 思维
- 微软项目技术结构思路 ExtJs/JQuery + Asp.net MVC + Wcf service + Entity Framework
- gp的分布、分区策略(概述)
- 如何下服务器上文件是否存在问题,怎么读取服务器数据库文件是否存在
- 2016版系统集成项目管理工程师下午案例分析考试范围
- 非极大值抑制(Non-Maximum Suppression,NMS)(转)
- freeldr 如何调用_BootMain的
- 10. 了解分配子(allocateor)的约定和限制
- matlab指数分布拟合,如何使用matlab拟合指数分布函数?
- SFI立昌SHA系列方案与应用
- uniapp 日期选择器_uni-app开始时间与结束时间(结束时间大于开始时间)picker编写...
- 搬砖之余干什么?推荐这几个优质公众号
- 干货!5招搞定问卷调查差异化分析
- matlab scope 多个图,matlab scope论文画图
- 宝塔linux升级,宝塔linux面板去除后台强制更新
- 情侣间为不吵架而“约法三章”,12条可参考理由!
- VSCode设置代理
- Android手机4G网络设置ipv6
- 【Oracle 故障处理一则】 ORA-600 - 13013处理过程