最近在读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语言方法总结的更多相关文章

  1. linux终端下 编译c语言程序

    linux终端下,编译C语言程序步骤为: 采用vi进行源代码编写,编写完成后,:wq存盘退出,如: vi test.c 在命令行下,运行gcc编译程序,生成执行码,如: gcc  -o test te ...

  2. ubuntu下如何编译C语言

    ubuntu下如何编译C语言     如果没有gcc编译器的话,使用以下命令获取 ~# sudo apt-get install gcc同时要下载辅助工具 ~# sudo apt-get instal ...

  3. Linux下安卓ndk混合编译调用so方法——QuickStart学习

    转自:http://www.52pojie.cn/thread-313869-1-1.html #注意:.h 和.c中的错误eclipse不会检查,只会调用时在手机或虚拟机中死掉.因此需要仔细检查其中 ...

  4. linux下程序编译出错解决方法

    一 *** No rule to make target 'subscribe_pkg/CMakeFiles/subscribe_pkg_node.dir/build'. 停止.CMakeFiles/ ...

  5. win10下clodeblocks编译C语言乱码

    打开settings->compile,在other compiler options添加下面两行代码: -fexec-charset=GBK-finput-charset=UTF-8

  6. MyEclipse部署项目到Tomcat上,但是classes文件夹下没有编译项目

    在MyEclipse中把项目部署到Tomcat上,但是Tomcat下的classes文件夹下没有编译项目解决方法:1-直接在点击菜单栏的Project--clean,对项目进行clean2-查看菜单栏 ...

  7. [转载]VS2012编译C语言scanf函数error的解决方法

    在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...

  8. Windows下Fortran编译Lapack库及使用的方法(转自新浪)

    Lapack 是一套被非常广泛使用的线性代数计算工具库,现在的主要编写语言时 Fortran90 .Lapack 基本上可以说是速度最快的线性代数计算库,我们看看官方给出的其被应用的几个地方就可以看出 ...

  9. 【问题】Java和Scala混合编译下无法正常使用lombok的问题

    工作中有java和scala和混合编译的工程,最近遇到一个问题,就是工程中有依赖java bean的scala文件,编译过程中发现编译器无法找到Java bean 中 lombok生成的getter, ...

随机推荐

  1. TangoAreaDescriptionMetaData区域描述元数据

    TangoAreaDescriptionMetaData com.google.atap.tangoservice Class TangoAreaDescriptionMetaData java.la ...

  2. [Erlang13]怎么把一个普通的进程挂入Supervisor监控树?

    简单来说:应该是在调用的start_link返回一个{ok,Pid}就可以把这个进程放入监控树Supervisor里面: -module(worker). -author("zhongwen ...

  3. MVVM Caliburn.Micro学习记录

    wpf中MVVM一直用的自己写的框架,最近试了试Caliburn.Micro. Caliburn.Micro可以通过x:name来进行属性和事件绑定. 比如 <Button x:Name=&qu ...

  4. c# 判断两个集合是否有交集

    /// <summary> /// 判断是否有交集 /// </summary> /// <typeparam name="T"></ty ...

  5. 重新理解javascript回调函数

    把函数作为参数传入到另一个函数中.这个函数就是所谓的回调函数 经常遇到这样一种情况,某个项目的A层和B层是由不同的人员协同完成.A层负责功能funA,B层负责funcB.当B层要用到某个模块的数据,于 ...

  6. struts2官方 中文教程 系列二:Hello World项目

    先贴个本帖的地址,免得其它网站被爬去了struts2入门系列二之Hello World  即 http://www.cnblogs.com/linghaoxinpian/p/6898779.html ...

  7. JVM_垃圾收集器

    最近刚好有时间,就简单的看了下JVM的几种垃圾回收器,它们都是计算机历史发展的产物,先简单的做一个整理,并没有哪一款垃圾收集器就一定是最优,还需要结合使用场景.参数配置等进行考量,根据系统情况搭配出尽 ...

  8. STR[#6]

    photo 小明在旅游的路上看到了一条美丽的河,河上有许多船只,有的船只向左航行,有的船只向右航行.小明希望拍下这一美丽的风景,并且把尽可能多的船只都完整地拍到一张照片中. 小明位于河的边上,并且可以 ...

  9. Windows便签快捷键

    Win+R 是运行的快捷件打 StikyNot 回车 快捷键 功能Ctrl+N 新建一张便笺Ctrl+D 删除当前便笺Ctrl+E 居中对齐Ctrl+R 右对齐Ctrl+J 左对齐Ctrl+I 斜体C ...

  10. Java 之多态

    Java 之多态(包含封装) 基础知识: Java 在处理基本数据类型(例如int ,char,double)时,都是采用按值传递的方式执行,除此之外的其它类型都是按引用传递的方式执行.对象除了在函数 ...