operator new: void* to T* conversion

在C++14标准(C++98/11也一样)中,在Annex C Compatibility里有这么一条:

Change: Converting void* to a pointer-to-object type requires casting

1
2
3
4
5
char a[10];
void* b=a;
void foo() {
char* c=b;
}

ISO C will accept this usage of pointer to void being assigned to a pointer to object type. C ++ will not.

但是为什么operator new()会返回void*且不用显式转换为T*就能赋值给T*呢?

阅读全文 »

How lambda is implemented in the compiler

在C++中lambda-expression的结果叫做闭包对象(closure object)。本篇文章并非是介绍C++ lambda的用法的(这一点《TC++PL》、《C++ Primer》中都十分详细,或者看我之前的总结C++11的语法糖#lambda表达式),而是从LLVM-IR来分析在Clang中是如何实现lambda-expression的。

阅读全文 »

Visibility and accessibility of access control mechanisms

在上一篇文章突破C++类的访问控制机制中简略提到了C++类的成员访问控制(public/protected/private)只是限制了成员名字的可访问性(accessable)**而非可见性(visable)**。在这篇文章中主要分析这种性质带来的后果以及如何避免。

阅读全文 »

Breaking through the access control mechanism of C++ classes

众所周知,在C++中类成员能够具有三种访问权限,分别为public/protected/private
[ISO/IEC 14882:2014]A member of a class can be

  • private: that is, its name can be used only by members and friends of the class in which it is declared.
  • protected: that is, its name can be used only by members and friends of the class in which it is declared, by classes derived from that class, and by their friends (see 11.4).
  • public: that is, its name can be used anywhere without access restriction.

从标准意图上来看,是希望隐藏类的实现细节和底层数据,即为封装。但是我们也可以通过一些特殊的方式来突破访问权限的限制。

阅读全文 »

C++ Technical Book Reviews Summary

单独开一篇文章,之前零零散散的书评散落在笔记微言中,没有具体辑录到一块,不方便索引。以后读过的技术类的书籍之后我会写一些评价就都放到这里来了。因为评价对象是技术书籍,只言片语也不能描述所有的技术细节,本文立意也非“技术笔记”而是“书籍评价”,所以我不会在这里涉及太多书籍中描述的技术细节,只是我作为一个普通读者的阅读感受以及分享我个人的阅读技巧,若其中对某些书透露出褒贬之意均为我个人对书籍的评价无任何贬低作者的意图。

阅读全文 »

Implicit declaration of special member-func and their standard behavior

在C++编程中比较痛恨欲绝的事莫过于:编译器瞒着程序员做了太多事。
本篇文章是从C++标准([ISO/IEC 14882:2014])中整理摘录出来的关于编译器生成类的默认构造函数(default constructor)/拷贝/移动构造函数(copy/move constructor)/拷贝/移动赋值操作符(copy/move assignment operator)/析构函数(destructor)这六个特殊成员函数的几种情况以及其实际行为的文档。可以作为《Inside The C++ Object Model》的辅助资料,组合观看效果更佳(通过标准描述来理解编译器的实现)。
另外,《Inside The C++ Object Model》主要是从“编译器实现”的角度来描述的,但是从“C++标准”的角度来看,书里很多是依赖于编译器实现的,就像虚函数表,标准并没有规定编译器应该用何种方式实现多态行为,自然也就不可能描述关于虚函数表的东西。
还有很多对于“编译器生成”的行为在主观意识中带有歧义的理解,都可以在这里找到解答,这也是读C++标准的乐趣所在——不论好坏,标准规定不会出错,所有不符合标准描述的实现都是unstandard的。

阅读全文 »

Specialization and overloading of C++ function templates

不同于类模板,可以具有显式特化和局部特化(partial specializations),函数模板没有”局部特化”的概念,只有显式特化和重载。

阅读全文 »

Pointers to class members in C++ are not pointers

“指向类成员的指针(Pointers to members)”,是一种在C++不常用的特性,但是这里使用术语“指针”略有不妥,因为它们并不包含地址,行为也不像指针。
本篇文章会通过LLVM-IR来分析clang中对于“指向类成员的指针”的实现方式,以及穿插C++14标准内定义的相关内容和涉及到的LLVM-IR的语法。

阅读全文 »

Why is extern "C" needed?

在上一篇文章(C/C++编译模型分析)中介绍了C和C++中编译和链接的成因和方式。接上篇文章的坑,本篇文章从extern "C"着手分析C和C++编译与链接模型中的不同点及其成因,主要为function overloadfunction signaturesname mangling三个部分。

阅读全文 »

C/C++ compilation and linking model analysis

C和C++均使用分离编译来支持多源文件模块化机制,但是为什么这么做以及如何做是个值得探讨的问题。本篇文章并非是讲述C和C++中如何才能产生不同链接的语法规则,而是分析下C/C++编译器是如何实现编译和链接模型的。

阅读全文 »