zoukankan      html  css  js  c++  java
  • 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
    ",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++语言中汇编语言的混合编程

  • 相关阅读:
    CPU使用率呈现正弦曲线
    编写一个简单的http server(Linux, gcc)
    c#操作 文件操作
    Javascript 数字时钟
    .net 中读取文本文件
    c# 常用字符串函数
    I2C总线之(三)以C语言理解IIC
    典型的多线程操作界面的例子
    uvm_common_phase.svh
    uvm_task_phase.svh
  • 原文地址:https://www.cnblogs.com/sansan/p/4044300.html
Copyright © 2011-2022 走看看