静态函数

C++ 内存解析

核能气质少年 提交于 2019-12-27 12:16:20
一、内存基本构成可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在 程序编译的时 候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。 二、三者之间的区别我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方。 例一:静态存储区与栈区 char* p = “Hello World1”; char a[] = “Hello World2”; p[2] = ‘A’; a[2] = ‘A’; char* p1 = “Hello World1”;    这个程序是有错误的, 错误发生在p[2] = ‘A’这行代码处 ,为什么呢? 是变量p和变量数组a都存在于栈区的

C++五大内存分区及区别

那年仲夏 提交于 2019-12-27 02:21:08
一、五大内存分区 在 C++ 中,内存分成 5 个区,他们分别是堆、栈、自由存储区、全局 / 静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete 。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 自由存储区,就是那些由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的。 全局 / 静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的,在 C++ 里面没有这个区分了,他们共同占用同一块内存区。 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多) 二、堆和栈的区别 堆和栈的主要的区别由以下几点: 1 、管理方式不同; 2 、空间大小不同; 3 、能否产生碎片不同; 4 、生长方向不同; 5 、分配方式不同; 6 、分配效率不同; 管理方式:对于栈来讲,是由 编译器 自动管理,无需我们手工控制;对于堆来说,释放工作由 程序员控制 ,容易产生 memory leak 。 空间大小:一般来讲在

C/C++内存四区

烂漫一生 提交于 2019-12-27 02:15:27
内存模型图 32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中0~3G是用户态空间,3~4G是内核空间,不同进程相同的逻辑地址会映射到不同的物理地址中。其逻辑地址其划分如下: 各个段说明如下: 3G用户空间和1G内核空间 静态区域: text segment( 代码段 ):包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。 data segment( 数据段 ):存储程序中已初始化的全局变量和静态变量 bss segment( BSS段 ):存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量,对于未初始化的全局变量和静态变量,程序运行main之前时会统一清零。即未初始化的全局变量编译器会初始化为0 动态区域: heap( 堆区 ): 当进程未调用malloc时是没有堆段的,只有调用malloc时采用分配一个堆,并且在程序运行过程中可以动态增加堆大小(移动break指针),从低地址向高地址增长。分配小内存时使用该区域。 堆的起始地址由mm_struct 结构体中的start_brk标识,结束地址由brk标识。 memory mapping segment( 映射区 ):存储动态链接库等文件映射、申请大内存(malloc时调用mmap函数) stack( 栈区 ):使用栈空间存储函数的返回地址

深入理解C语言内存管理

北慕城南 提交于 2019-12-27 02:10:21
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。 问题不能拖,我这就来学习一下吧,争取一次搞定。 在任何程序设计环境及语言中,内存管理都十分重要。 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 int var1 = 1; 4 5 int main(void) { 6 int var2 = 2; 7 printf("hello, world!\n"); 8 exit(0); 9 } 经过gcc hello.c进行编译之后得到了名为a.out的可执行文件 [tuhooo@localhost leet_code]$ ls -al a.out -rwxrwxr-x. 1 tuhooo tuhooo 8592 Jul 22 20:40 a.out ls命令是查看文件的元数据信息 [tuhooo@localhost leet_code]$ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),

Objective-C笔记

最后都变了- 提交于 2019-12-26 22:31:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、在编译一个使用了CPerson类的文件时,如果不需要知道该类的全部细节,只需要知道有一个类名叫CPerson,最好“向前声明”该类(同理于对一个协议的引用),这样做也可以避免“循环引用”问题: 例: @class CPerson 例: #import "CShape.h" #import "CDrawable.h" @interface CRectangle : CShape <CDrawable> 2、多用字面量语法,少用与之等价的方法 (NSString/NSNumber/NSArray/NSDictionary) 字面量语法的限制:除了字符串以外,所创建出来的对象必须属于Foundation框架才行。如果自定义了这些类的之类,则无法用字面量语法创建其对象。 例: NSString *someString = @"Effective Objective-C 2.0"; NSNumber *someNumber = @1 ; NSNumber *floatNumber = @2.5f; NSNumber *boolNumber = @YES; NSNumber *charNumber = @'a'; NSArray *animals = @[@"cat", @"dog",@"pig"];//若@“dog

gcc编译动态和静态链接库

安稳与你 提交于 2019-12-26 04:38:10
我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。 第1步:编辑得到举例的程序--hello.c和test.c; 测试程序test.c调用了公用函数my_lib_function。 hello.c: #include <stdio.h> void my_lib_function() { printf("library routine called/n"); } test.c: int main() { my_lib_function(); return 0; } 第2步:将hello.c编译成.o文件; 无论静态库,还是动态库,都是由.o文件创建的(动态库可以直接通过.c)。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。 在系统提示符下键入以下命令得到hello.o文件。 # gcc -c hello.c 第3步:由.o文件创建静态库; 静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。 例如:我们将创建的静态库名为myhello

C# Struct结构体

混江龙づ霸主 提交于 2019-12-25 14:19:56
C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括数据成员和方法成员。   结构和类的区别:   1、结构是值类型,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。   2、结构类型直接存储成员数据,让其他类的数据位于对中,位于栈中的变量保存的是指向堆中数据对象的引用。   C#中的简单类型,如int、double、bool等都是结构类型。如果需要的话,甚至可以使用结构类型结合运算符运算重载,再为C#语言创建出一种新的值类型来。   由于结构是值类型,并且直接存储数据,因此在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能。    一、声明结构的语法 - struct关键字 public struct AddressBook { //字段、属性、方法、事件 }   对于类而言,两个变量指向同一个对象的情况是存在的,因此对这样两个变量中的任意一个进行操作,起结果必然会影响另外一个,因为它们指向的是同一个对象。   结构是值类型,,直接包含它自己的数据,每个结构都保存自己的一份数据,修改每一个结构的数据都不会对其他结构的数据造成影响。    二、给结构赋值   如果从结构中创建一个对象,并将该对象赋给某个变量,则该变量包含结构的全部值。复制类型为结构的变量时,将同时复制该结构所持有的所有数据。由于结构不是引用类型

linux下动态链接库.so文件 静态链接库.a文件创建及使用

こ雲淡風輕ζ 提交于 2019-12-25 02:51:16
转摘网址为:http://www.cnblogs.com/fengyv/archive/2012/08/10/2631313.html Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为静态库,是好多个.o合在一起,用于静态连接 .la为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息。可以用如下命令查看 *.la文件的格式 $file *.la *.la: ASCII English text 所以可以用vi来查看其内容。 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 创建.a库文件和.o库文件: [yufei@localhost perl_c2]$ pwd /home/yufei/perl_c2 [yufei@localhost perl_c2]$ cat mylib.c #include <stdio.h> #include <string.h> void hello(){ printf("success call from perl to c library\n"); } [yufei@localhost perl_c2]$ cat mylib.h extern void

PHP 实现页面静态化

大城市里の小女人 提交于 2019-12-24 03:03:03
PHP文件执行阶段: 语法分析-》编译-》运行 静态html文件执行顺序 :运行 动态程序: 连接数据库服务器或者缓存服务器-> 获取数据->填充到模板->呈现给用户 关于优化页面响应时间 动态页面静态化 优化数据库 使用负载均衡 使用缓存 1.  动态页面静态化: 页面中一些内容不经常改动 不适用于内容经常变换的应用:例如:微博等。如果页面中一些内容改动,动态页面静态化是非常有效的加速方法。   动态页面静态化好处: 减少服务器脚本的计算时间 降低服务器的响应时间 2.  动态URL地址设置静态形式(伪静态) 3.  php静态化: 1.纯静态: a. 局部纯静态 b. 全部纯静态 2. 伪静态 4.Buffer认知(php.ini文件中output_buffering=on开启缓存区,ob_start()也可以开启缓存区) a) Buffer其实就是缓冲区,一个内存地址空间,主要用于数据存储区域。 b)输出流程:内容-》php buffer->tcp->终端 c)获取缓冲区内容:php内容函数 ob_get_contents(); d)ob_start():开启缓冲区(php5.3默认开启output_buffering=on) 5.php如何实现页面纯静态化 a)基本方式 i.file_put_contents()函数:将一个字符串写入文件 file_put_contents

Java静态类

扶醉桌前 提交于 2019-12-23 06:42:31
http://www.cnblogs.com/kissazi2/p/3971065.html Java中的类可以是static吗?答案是可以。在java中我们可以有静态实例变量、静态方法、静态块。类也可以是静态的。 java允许我们在一个类里面定义静态类。比如内部类(nested class)。把nested class封闭起来的类叫外部类。在java中,我们不能用static修饰顶级类(top level class)。只有内部类可以为static。 静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同。 (1)内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。 (2)非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。 (3)一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。 基于上面的讨论,我们可以通过这些特性让编程更简单、有效。 /* 下面程序演示如何在java中创建静态内部类和非静态内部类 */ class OuterClass{ private static String msg = "GeeksForGeeks"; // 静态内部类 public static class NestedStaticClass{ //