gcc下c++的对象模型 (1)】的更多相关文章

所有示例代码在如下环境中执行 ubuntu 16.04.4 (64位) gcc version 5.4.0 开启std11 gdb version 7.11.1 1. 空类的大小 定义一个空类A,实例化对象a,b.分别查看a的地址和b的地址.代码如下: #include <iostream> class A { }; int main() { A a; A b; std::cout << sizeof(A) << std::endl; std::cout <<…
在MinGW GCC下编译带sleep()函数的测试程序,不管是包含了unistd.h头文件,还是stdio.h.stdlib.h头文件,就是找不到该函数的定义!在linux下,sleep()函数的头文件是:unistd.h,但在MinGW GCC下没有了这个函数的定义,到是在windows.h文件中有Sleep()函数的定义,其单位是ms级的延迟处理…
GCC下32位与64位机器类型变量所占字节数 在C语言中,编译器一般根据自身硬件针对类型变量来选择合适的字节大小,下面列举一下在GCC编译器下32位机器与64位机器各个类型变量所占字节数目: C语言 32位机器 64位机器 char 1 1 short int 2 2 int 4 4 long int 4 8 long long int 4 8 指针类型*p 4 8 float 4 4 double 8 8…
C++对象模型 何为C++对象模型? 部分: 1.        语言中直接支持面向对象程序设计的部分 2.        对于各种支持的底层实现机制 语言中直接支持面向对象程序设计的部分,如构造函数.析构函数.虚函数.继承(单继承.多继承.虚继承).多态等等,这也是组里其他同学之前分享过的内容.第一部分这里我简单过一下,重点在底层实现机制. 在c语言中,“数据”和“处理数据的操作(函数)”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性.在c++中,通过抽象数据类型(ab…
结构/类对齐的声明方式 gcc和windows对于modifier/attribute的支持其实是差不多的.比如在gcc的例子中,内存对齐要写成: class X { //... } __attribute__((aligned())); 但是实际上你写成 ))) X { /*...*/ }; gcc一样可以识别.这样MSVC和gcc就可以使用宏完成跨平台编译. 对齐类型的变量在堆与栈上的分配 对齐在以下场合都能提示编译器为它的变量分配对齐的地址: void foo() { X v; // v是…
继承是C++作为OOD程序设计语言的三大特征(封装,继承,多态)之一,单一非多态继承是比较好理解的,本文主要讲解GCC环境下的多重继承和虚拟继承的对象内存布局. 一.多重继承 先看几个类的定义: 01 class Top 02  { 03 public: 04       int a; 05  }; 06   07  class Left : public Top 08  { 09 public: 10       int b; 11  }; 12   13  class Right : pub…
今天发现一个问题,与inline有关,也与编译时候是不是优化有关. 大概问题可以用下面的代码来描述: 先写一个libtest1,代码如下 libtest1.h #ifndef LIBTEST_H #define LIBTEST_H class Test{ public: inline void fun1()const; void fun2()const; }; #endif //!LIBTEST_H libtest1.cpp #include <stdio.h> #include "…
今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: char *strstr(const char*s1,const char*s2) { const char*p=s1; const size_t len=strlen(s2); ;p++) { ) return (char*)p; } ); } 从上面的GCC中strstr实现代码可以分析出,strstr的时间复杂度是O(n2)的(因为strncmp是O(N)的),不过对长字符串匹配子串上…
前言 上一篇博客C++对象模型的那些事儿之一为大家讲解了C++对象模型的一些基本知识,可是C++的继承,多态这些特性如何体现在对象模型上呢?单继承.多重继承和虚继承后内存布局上又有哪些变化呢?多态真正的底层又是如何实现呢?本篇博客就带大家全面理解一下C++对象模型,从而理解上述疑惑. 引例 还是以上篇博客的Animal类说起,假设我们有一个Dog类,它继承了Animal类.程序如下: class Animal{ public: char name[10];//动物名字 int weight;//…
cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygwin下的gcc和linux下的gcc完全使用的是相同的Toolsets.所以完全可以和linux一起同步更新gcc版本,而不用担心问题,并且在cygwin/gcc做的东西(不用win32的)可以无缝的用在linux下,没有任何问题.是在windows下开发…