自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 ELF中与动态链接相关的段

在Linux 下,动态链接器 ld.so 是一个共享对象,操作系统同样通过映射的方式将其加载到进程的地址空间中。操作系统在加载完动态链接后,将控制权交给动态链接器的入口地址,动态链接器执行一系列自身的初始化操作,而后根据当前的环境参数,对可执行文件进行动态链接工作,完成后将操作系统的控制权交给可执行文件的入口地址。动态链接使用了很多的段信息,以下简述这些段:1 .interp 段动态链

2015-09-28 23:05:14 3102

原创 动态链接过程延迟绑定的实现(PLT)

动态链接比静态链接要慢1%~5%,根据动态链接中PIC(与地址无关代码)的原理PIC,可以知道造成该情况的原因如下:1.动态链接下对于全局和静态数据的访问都要进行复杂的GOT(全局偏移表)定位,然后间接寻址;对于模块间的调用也要先定位GOT,然后再进行跳转2.动态链接的链接工作是在运行时完成,即程序开始运行时,动态链接器都要进行一次链接工作,而链接工作需要复杂的重定位等工作,减慢了启动速度

2015-09-28 21:18:21 4946

转载 C++之char , signed char , unsigned char

ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char.而不是像short、int一样只有两种(int默认就是unsigned int).三者都占1个字节(1 byte),因此:signed char取值范围是 -128 到 127(有符号位)unsigned char 取值范围是 0 到 255这个大家都很清楚!!

2015-09-28 15:44:28 736

转载 C语言实现变长数组

struct MyData {    int nLen;    char data[0];};         开始没有理解红色部分的内容,上网搜索下,发现用处很大,记录下来。                  在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于

2015-09-26 11:47:40 4308

原创 静态成员函数的作用与静态数据成员的初始化

静态数据成员与静态函数成员都是同一个类的所有对象共享的成员。补充以下两个个知识点:静态数据成员的初始化:静态数据成员的初始化必须在类定义外进行。静态函数成员的作用:静态函数成员与普通函数成员一样,在ELF 文件中都只会保留一份copy,它们的区别体现在:静态成员函数可以在不定义对象的情况下直接调用,而非静态成员函数不行。class X{public: void f1(){

2015-09-26 10:03:50 1048

原创 详解RVO与NRVO(区别于网上常见的RVO)

一直以来对 RVO 与 NRVO 以及编译器的优化操作之间的关系都不太分得清。这一次想了两天,查看了若干资料以后,总算弄清楚了。1.RVO(Return Value Optimization)先来看一下维基百科上对RVO(return value optimization) 的定义:"Return value optimization, or simply RVO, is

2015-09-24 13:29:48 12589

原创 动态链接库中与地址无关代码(PIC)对于地址引用的处理

动态链接库希望所有进程共享指令段而各自拥有数据段的私有副本,为了实现这个目标,就要采用与地址无关代码(PIC: Position Independent code)的技术。该实现的基本思想是:把指令中需要修改的部分分离出来,跟数据部分放在一起,这样指令部分就可以保持不变,而数据部分则在每个进程拥有一个副本。与地址无关的代码,也就是需要考虑代码中会对地址进行引用的情况,共享对象(GCC中

2015-09-23 22:54:22 3852

原创 动态链接知识点

1.基本思想:动态链接的基本思想是:将链接的过程推迟到运行时再执行。2.动态链接文件的格式:在LINUX 中,ELF的动态链接文件被称为动态共享对象(DSO,dynamic shared object),以.so为扩展名的文件在WINDOWS中,EP的动态链接文件被称为动态链接库(DLL,dynamic link library),以 .dll 为扩展名的文件3

2015-09-22 23:23:59 833 1

原创 可执行文件从装载到运行的全过程描述

我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,(关于源代码到可执行文件的介绍见我的另一篇博客:程序从代码到可执行文件的过程简述)那么当我们在cmd窗口敲出指令$test argv1 argv2\n 后,操作系统是怎么将我们的可执行文件加载并运行的呢?首先知道,计算机的操作系统的启动程序是写死在硬件上的,每次计算机上电时,都将自动加载启动程序,之后的每一个程序,每一个应用,都

2015-09-21 21:53:36 3522

原创 进程虚拟空间分布中特殊的VMA

进程虚拟地址空间分布中,有几个特殊的区域,它们并不会映射到可执行文件内,分别为:堆、栈、vdso1.堆堆是由系统库进行管理的,我们通过C语言的 malloc() 内存分配函数分配到的空间就是在堆中分配的;2.栈也称堆栈,每个线程都有属于自己的堆栈。3.vdso事实上,“vdso”的地址已经位于内核空间了(即大于0xC0000000),它是一个内核的模块,进程可以通过它来与内

2015-09-20 22:13:25 718

转载 详解LMA(装载内存地址)与VMA(虚拟内存地址)

关于LMA和VMA,这个问题,有点点小复杂,不过,此处,我会把我的理解,尽量通过通俗的方式解释出来,以方便理解。当然,鄙人水平有限,难免有错,希望各位批评指正。一般提及LMA和VMA,多数情况都是和ld,链接器相关的。在了解这两个名词的详细含义之前,有些基本知识和前提要说一下:[基础知识]1。从你写的源代码到执行你的程序,一般经历了这几个过程:源代码编辑 -> 编译 ->

2015-09-20 21:55:03 854

原创 弱符号与强符号,弱引用与强引用

1.弱符号与强符号对C/C++而言,编译器默认函数和初始化了的全局变量为强符号。未初始化的全局变量为弱符号。此处弱符号与强符号均是针对定义来说的,不是针对符号的引用。也可以通过GCC的 “__attribute__((weak))”来定义任何一个强符号为弱符号。extern in ext;int weak;int strong = 1;__attribute__((weak)) in

2015-09-18 22:07:08 1796

原创 "extern C"关键字的作用

extern "C" 关键字用来声明或定义一个C的符号。也即是说,C++编译器会将在 extern "C" 的大括号内部的代码当做C语言代码处理。则C++的名称修饰机制将不会起作用,此时,在Visual C++ 平台下,会将C语言的符号进行修饰,即在函数名前加下划线。而Linux版本的GCC编译器将不会对函数名做任何修饰。作用举例:很多时候我们会碰到有些头文件声明了一些C的

2015-09-18 21:49:49 643

原创 目标文件ELF中的内容

1.目标文件格式简述源文件经过编译器后生成目标文件,目标文件按照可执行文件的格式来存储,最初的可执行文件的格式为COFF,经过演变,现在的 windows下的可执行文件的格式为PE-COFF格式,而linux下的可执行文件的格式为ELF 格式。两种格式很类似。2.目标文件内容简述目标文件是以段的形式存储的。目标文件中包含了很多段,其中,程序源代码编译后的机器指令被放置在代码段(

2015-09-18 21:36:10 668

原创 使用swap来释放vector的内存

先说明如何使用swap来释放 vector 的内存,然后再说明在释放过程中发生了什么。释放操作如下:void func(){ vector vec(2,3); vec.swap(vector()); //该swap操作将释放原本 vector 所占用的内存 }我们知道,vector 是使用三个指针 start,finish,end_of_storage 来对 vector 所占用

2015-09-18 09:46:38 2585 4

原创 将目标文件分为程序段与数据段两大类的原因

目标文件中有很多段,根据其性质进行分类可分为两类,一类是程序段,代码段即属于程序段;另一类是数据段,.bss段和.data 段均属于数据段。这样划分的原因如下:1.可以防止程序的指令被有意或无意的改写:程序段中的指令通常都是不可写的,而数据段中的信息通常是可读写的。因此,将数据与指令分别映射到两个虚拟区域,并将这两个区域的权限分别设置为可读和读写,能够有效的防止程序指令被破坏

2015-09-17 23:10:20 800

原创 自定义段的方法

GCC提供了一个扩展机制,使得程序员可以指定变量所处的段。如下例__attribute__((section("FOO"))) int global = 43;int main(){ __attribute__((section("BAR"))) static int x;}对上述代码进行编译得到目标文件后查看段信息,可以看出变量 global 与 x 均是在对应指定的自定义

2015-09-17 23:01:26 2062

原创 关于BSS段的大小

1.BSS段中的内容先明确 BSS 段存放的是未初始化的全局变量与局部静态变量,此处指的存放是指为其预留空间(占位符)。但BSS段在磁盘上不占用任何空间,它仅是记录所有未初始化全局变量与局部静态变量的大小总和。2.BSS段在加载运行前的处理当可执行文件加载运行前,会为BSS段中的变量分配足够的空间并全部自动清理(因此,才有未初始化的全局变量的值为0的说法)。3.BS

2015-09-17 21:44:20 4018

原创 vector的clear()操作与内存

首先,很明确的给定:vector 的 clear() 操作是不会释放内存的!!!!!!!!!下面说说 vector 的 stl 源码里,clear()函数在做什么。以下是cygnus C++ 2.91.57 for windows 版本的 STL 中的部分源码: void clear() { erase(begin(), end()); } 可以看出,vector 的clea

2015-09-17 11:32:16 3306

原创 程序从代码到可执行文件的过程简述

代码编写结束后,使用IDE(集成开发环境)直接编译就可以得到可执行文件。在这个过程中,IDE进行了很多内部操作。分别为:预处理,编译,汇编,链接。之后按序简述每一个步骤的执行1.预处理GCC预编译的指令为:$gcc -E hello.c -o hello.i ,C++文件预编译后的扩展名为:hello.ii预编译步骤主要操作源代码文件中以“#” 开始的预编译指令。主要处理规则如

2015-09-16 22:30:59 2316

转载 CUDA多线程

随着多核CPU和众核GPU的到来,并行编程已经得到了业界越来越多的重视,CPU-GPU异构程序能够极大提高现有计算机系统的运算性能,对于科学计算等运算密集型程序有着非常重要的意义。这一系列文章是根据《CUDA C语言编程指南》来整理的,该指南是NVIDIA公司提供的CUDA学习资料,介绍了CUDA编程最基本最核心的概念,是学习CUDA必不可少的阅读材料。初学CUDA,笔记错误之处在所难免,

2015-09-16 14:55:35 6873

原创 针对不同类型迭代器实现各自的高效函数重载

1.不同的迭代器类型对相同功能的函数需进行不同的处理1.Input Iterator :只读迭代器,不允许外界改变所指对象2.Output Iterator:只写迭代器3.Forward Iterator:单向迭代器,只允许单向移动4.Bidirectional Iterator:双向迭代器5.Random Access Iterator:随机访问迭代器(p+n,p-n)

2015-09-12 22:24:23 764

原创 iterator_traits 存在的作用与意义

1.关于迭代器有关类型的获取与iterator_traits:有时候可能我们会需要知道迭代器的某些具体有关类型,如:迭代器所指对象的类型,两个迭代器之间距离的类型,迭代器解引用操作结果的类型,迭代器->操作结果的类型,以及迭代器本身的类型(单向,双向等)。因此,不同容器的迭代器都必须支持对上述迭代器有关类型的查询反馈,STL则采用内嵌类型声明的方式来实现对上述类型的返回。其中:value_

2015-09-12 21:34:01 3442

原创 STL 中iterator_traits

STL中,设计适当的相应类型是迭代器的责任。而设计适当的迭代器则是容器的责任。迭代器的相应类型有以下几种:1.value_type迭代器所指对象的类型2.difference_type迭代器的差值的类型3.reference_type迭代器的*操作的类型4.pointer_type迭代器的->操作的类型5.iterator_type迭代器

2015-09-12 20:14:56 590

原创 使用模板获取迭代器所指对象的类型

假设现在要求通过迭代器类型推测出迭代器所指对象的类型,在不考虑 value_type 的情况下,使用模板的参数推导机制实现要求,即:template void func(T iter){ //需要知道迭代器 iter 所指对象的类型,注:不是T}可以通过加一层函数来实现,将当前函数当做通用接口,即:template void func(T iter)

2015-09-12 11:08:08 1358

转载 关于auto_ptr_ref的一点问题

今天我在看 The C++ Standard Library 的时候,总觉的上面讲的关于auto_ptr_ref的问题没有说清楚,查了网上的资料发现也没有说清。 也许还有很多朋友像我一样对此存在疑问。其实,这个问题有没有弄清楚,对实际编程影像并不大,但是本着“勿在浮沙筑高台”的精神,我用了一个晚上的时间,来个彻底的大调查,终于基本上弄明白了其中的道理。(大多数时间都浪费在VC上,因为 VC支持对右

2015-09-12 09:51:51 447

原创 指针值加上一个数值的实际意义

一直没怎么注意指针值加上数值的问题,认为就是在指针地址上往后叠加n个字节,直到今天写STL 库中二级空间配置器,内存报错:堆被损坏!单步跟踪后才发现问题首先说明问题:int a(0); //假设 &a = 0x1002int * p = &a; //此时 p = 0x1002p = p + 3; //错误想法: p = 0x1002 + 3 = 0x1005//但该操作的实际

2015-09-11 16:08:54 1323

转载 C++ 内存分配(new,operator new)详解

本文主要讲述C++ new运算符和operator new, placement new之间的种种关联,new的底层实现,以及operator new的重载和一些在内存池,STL中的应用。一 new运算符和operator new():     new:指我们在C++里通常用到的运算符,比如A* a = new A;  对于new来说,有new和::new之分,前者位于std 

2015-09-09 12:31:06 512

转载 关于 ::operator new

文章转自:http://blog.csdn.net/solstice/article/details/6198937 本文只考虑 Linux x86 平台,服务端开发(不考虑 Windows 的跨 DLL 内存分配释放问题)。本文假定读者知道 ::operator new() 和 ::operator delete() 是干什么的,与通常用的 new/delete 表达

2015-09-09 11:13:49 616

转载 C ++ 函数后面加throw()的作用

Following declaration gives a message to the user of your class: my method doesn't throw any exception. Don't bother to put a try/catch block around itwhen you use it.void A::foo() throw();

2015-09-09 09:07:35 1599

转载 c++中的set_new_handler和new_handler

详细可参考 《effective c++》第三版 条款49:了解new_handler的行为相关链接:http://blogold.chinaunix.net/u/3374/showart_1849816.html 当operator new申请一个内存失败的时候,它会进行如下的处理步骤:    1、如果存在客户指定的处理函数,则调用处理函数(new_han

2015-09-09 09:01:22 391

转载 Python图表绘制:matplotlib绘图库入门

摘要 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。python目录[-]Python图表绘制:matplotlib绘图库入门Python图表绘制:matplotlib绘图库入门matplot

2015-09-08 21:46:38 1221

原创 sizeif(i++).sizeof(++i) 的问题

考虑以下代码:int i = 3;int j = sizeof(++i);int k = sizeof(i++);cout << i << endl; 对上述代码,输出的结果为 : 3原因:根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, k= sizeof(i++); 在编译的时候被翻译成 j=sizeof((i++的数据类型)) 也就是 j = s

2015-09-08 16:56:17 1117

转载 C/C++中的预编译指令

程序的编译过程可以分为预处理、编译、汇编三部分,其中预处理是首先执行的过程,预处理过程扫描程序源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程读入源代码之后,会检查代码里包含的预处理指令,完成诸如包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码的工作。下面介绍一些C/C++中预编译的指令。一 #指令预处理指令以#号开头,并且#号必须是该行除了

2015-09-08 09:32:48 518

转载 python 字典访问的三种方法

定义字典 dic = {'a':"hello",'b':"how",'c':"you"}方法一:for key in dic:  print key,dic[key]  print key + str(dic[key])结果:  a hello  ahello  c you  cyou  b how  bhow细节:

2015-09-07 22:09:29 763

转载 C++中export关键字的尴尬处境

C++中export关键字的尴尬处境【原创文章,转载请保留或注明出处:http://blog.csdn.net/hikaliv/article/details/4474835】分离编译模式(Separate Compilation Model)允许在一处翻译单元(Translation Unit)中定义(define)函数、类型、类对象等,在另一处翻译单元引用它们。编译器(Comp

2015-09-07 11:12:29 997

转载 hpp 和 h 区别

hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。   

2015-09-07 09:23:31 569

原创 模板的模板参数匹配报错问题

今天写一个模板类,使用了模板的模板参数,在实例化类对象时,报错:1. 在VS2013中错误编码为:error C3201: 类模板“std::vector”的模板参数列表与模板参数“CONT”的模板参数列表不匹配 2. 在G++中错误信息为: error: type/value mismatch at argument 2 in template parameter list for ‘templ

2015-09-06 17:35:49 7052 1

转载 一些不常见的C++关键字

学过程序语言的人相信对关键字并不陌生。偶然间翻起了《C++ Primer》这本书,书中列举了所有C++的关键字。我认真核对了一下,竟然发现有若干个从未使用过的关键字。一时间对一个学了六年C++的自己狠狠鄙视了一番,下决心一定要把它们搞明白!图1红色字体给出的是我个人感觉一般大家都会比较陌生的关键字,下边我们逐个学习。图1 C++ 关键字一、typeid从名字直观看来,该关键字应

2015-09-02 17:41:46 641

原创 7.3 执行期类型识别(Runtime Type Identification,RTTI)

Q1:保证安全的基类到派生类的向下转换操作• 支持安全的类型转换对多态类而言,需要在执行期判断指针所指对象的真实类型,因此,会引入额外的空间与时间开销: ○ 空间开销:存储类型信息,通常是一个指针,指向某个类型信息的节点(该指针放置在虚函数表的第一个表项中) ○ 时间开销:在执行其决定其类型• 区别一个类是否具有多态性,是根据其是否内含虚函数来进行判断。(注:析构函数是唯一不能重载

2015-09-01 10:46:17 456

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除