最近在读SGI STL源码,感觉对C++的学习很有帮助,之前对于泛型、iterator、traits等等各种特性的概念非常模糊,通过这两天的琢磨,再加上《STL 源码剖析》的帮助,对C++那诡异的语法也不再害怕了。
在其中遇到的一些问题,总结如下:
1. C++空白基类最优化(EBO)
参考:http://www.xuebuyuan.com/1610977.html
如果有一个空类,如下。其所占空间并非0byte,而通常是1 byte。
class A{ };
如果有一个类,如下。而a 占1 byte,而int 占 4bytes,但由于编译器的alignment对齐,该类占空间8bytes。
class B { public: A a; int x; }
而类C,如下。则由于空白基类最优化而所占空间为4,因为如果所继承类中没有任何数据(所占空间为1 byte),编译器就会自动优化。
class C: public A{ public: int x; };
2. C++编译C语言函数
在C++中的new函数实现,其底层仍然使用的是C语言中的malloc,其实现思路如下(参考:http://songpengfei.iteye.com/blog/1100239 )。
文件test_extern_c.h和test_extern_c.c定义了一个函数ThisIsTest()
//file:test_extern_c.h
#ifndef __TEST_EXTERN_C_H__
#define __TEST_EXTERN_C_H__
#ifdef __cplusplus
extern "C"{
#endif
extern int ThisIsTest(int a,int b);
#ifdef __cplusplus
}
#endif
#endif
而函数的实现如下:
#include "test_extern_c.h" int ThisIsTest(int a,int b){ return a * b; }
main.cpp调用如下:
#include "test_extern_c.h" #include "stdio.h" #include "stdlib.h" class FOO{ public: int bar(int a,int b){ printf("result=%i ",ThisIsTest(a,b)); } }; int main(int argc,char **argv){ int a = atoi(argv[1]); int b = atoi(argv[2]); FOO *foo = new FOO(); foo->bar(a,b); return(0); }
在mac GCC编译如下:
gcc -c test_extern_c.c // 生成了目标文件
而如下命令则可以生成目标文件。
g++ main.cpp test_extern_c.o
3. C++语言中new/delete的实现机制
4. C++语言中汇编语言的混合编程