C++下混合编译c语言方法总结
最近在读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++语言中汇编语言的混合编程
C++下混合编译c语言方法总结的更多相关文章
- linux终端下 编译c语言程序
linux终端下,编译C语言程序步骤为: 采用vi进行源代码编写,编写完成后,:wq存盘退出,如: vi test.c 在命令行下,运行gcc编译程序,生成执行码,如: gcc -o test te ...
- ubuntu下如何编译C语言
ubuntu下如何编译C语言 如果没有gcc编译器的话,使用以下命令获取 ~# sudo apt-get install gcc同时要下载辅助工具 ~# sudo apt-get instal ...
- Linux下安卓ndk混合编译调用so方法——QuickStart学习
转自:http://www.52pojie.cn/thread-313869-1-1.html #注意:.h 和.c中的错误eclipse不会检查,只会调用时在手机或虚拟机中死掉.因此需要仔细检查其中 ...
- linux下程序编译出错解决方法
一 *** No rule to make target 'subscribe_pkg/CMakeFiles/subscribe_pkg_node.dir/build'. 停止.CMakeFiles/ ...
- win10下clodeblocks编译C语言乱码
打开settings->compile,在other compiler options添加下面两行代码: -fexec-charset=GBK-finput-charset=UTF-8
- MyEclipse部署项目到Tomcat上,但是classes文件夹下没有编译项目
在MyEclipse中把项目部署到Tomcat上,但是Tomcat下的classes文件夹下没有编译项目解决方法:1-直接在点击菜单栏的Project--clean,对项目进行clean2-查看菜单栏 ...
- [转载]VS2012编译C语言scanf函数error的解决方法
在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...
- Windows下Fortran编译Lapack库及使用的方法(转自新浪)
Lapack 是一套被非常广泛使用的线性代数计算工具库,现在的主要编写语言时 Fortran90 .Lapack 基本上可以说是速度最快的线性代数计算库,我们看看官方给出的其被应用的几个地方就可以看出 ...
- 【问题】Java和Scala混合编译下无法正常使用lombok的问题
工作中有java和scala和混合编译的工程,最近遇到一个问题,就是工程中有依赖java bean的scala文件,编译过程中发现编译器无法找到Java bean 中 lombok生成的getter, ...
随机推荐
- struts2 和 js 标签取值
struts标签是在服务器上替换成html代码的,js是在用户浏览器执行的,这个顺序如果没搞清楚你是搞不好web开发的
- thinkjs系统服务启动
- 2、Semantic-UI之网格布局
2.1 网格布局 在semantic-ui中提供了16个网格,使用class="column",当然也可以通过数字来表示当前网格大小. 在Semantic-UI中定义的网格 ...
- tcxgrid控件中drag a column header here to group by that column移除方法
- [respberry pi3][suse] 配置docker
[respberry pi3][suse] 配置docker arm64 suse上总的软件还是比较少的,特别是对32bit的一些支持,比较熟悉ubuntu,但是不能raspberry pi3没有64 ...
- Web.config配置文件详解(新手必看) (转载)
原文地址:http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html <?xmlversion="1.0&quo ...
- MySQL数据库(三)
1. 创建表 create table student( id int unsigned not null auto_increment primary key, name varchar(8) no ...
- MVC MVC常见错误及解决办法
MVC常见错误及解决办法 问题1: 必须添加对程序集“EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5 ...
- 【QTP专题-优化】VBS脚本启动QTP并运行测试
使用vbs脚本启动QTP并运行测试,startQTP.vbs '******************************************************************** ...
- git .gitignore忽略规则不生效解决办法
忽略规则不生效, 原因是.gitignore只能忽略那些原来没有被track的文件, 如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 那么解决方法就是先把本地缓存删除(改变成 ...