博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++下混合编译c语言方法总结
阅读量:5299 次
发布时间:2019-06-14

本文共 1338 字,大约阅读时间需要 4 分钟。

最近在读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\n",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++语言中汇编语言的混合编程

 

转载于:https://www.cnblogs.com/sansan/p/4044300.html

你可能感兴趣的文章
C#中使用Split分隔字符串的技巧
查看>>
(springboot)freemarker(二)
查看>>
linux下golang gRPC配置详解
查看>>
mongodb 简单使用说明
查看>>
eclipse的调试方法的简单介绍
查看>>
OneAPM 云监控部署与试用体验
查看>>
加固linux
查看>>
wget 升级
查看>>
为什么需要大数据安全分析?
查看>>
day13.字典复习
查看>>
IPSP问题
查看>>
(转)Java中的String为什么是不可变的? -- String源码分析
查看>>
HNU 10362 A+B for Input-Output Practice (II)
查看>>
iOS——UIButton响应传参数
查看>>
【转帖】关于'eh vector constructor/destructor iterator'的讨论及类的内存分布模型
查看>>
十. 图形界面(GUI)设计9.列表和组合框
查看>>
10.17动手动脑
查看>>
操作系统实验一:并发程序设计
查看>>
互联网协议入门(一)
查看>>
16_Python变量作用域_Python编程之路
查看>>