码迷,mamicode.com
首页 > 编程语言 > 详细

C++下混合编译c语言方法总结

时间:2014-10-22 21:55:00      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   ar   使用   sp   文件   数据   div   

最近在读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语言方法总结

标签:blog   http   io   ar   使用   sp   文件   数据   div   

原文地址:http://www.cnblogs.com/sansan/p/4044300.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!