1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
//当年看得是E文,一时忘记了。
2010/04/27 Java面试题
2.8 heap和stack有什么区别。
栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。
堆是栈的一个组成元素。
//
若一个静态成员函数采用类外定义,则函数头前面不应加上static关键字。///规定
c++ primer 讲的我云里雾里!!!
protected成员是可以继承下来,继承下来了后,在编写派生类时,他的获取权限是属于这个派生类了,再也不属于基类了,就可套用private规则:只适用于本类,其它的类(包括基类)都不能直接操作。似乎这么去记忆就没有问题了,不会搞混了
link:http://blog.codingnow.com/2010/03/cpp_protected.html
//shell 读取文件
shell 脚本:一次读取文件的一行,并输出写法一:
#!/bin/bash
while read line
do
echo $line #这里可根据实际用途变化
done < urfile
写法二:
#!/bin/bash
cat urfile | while read line
do
echo $line
done
注意:以上代码中urfile 为被读取的文件
/// 合成的默认构造函数
它使用了与变量初始化相同的规则来初始化成员。
对有类类型的成员,。。。。。。。。。
对内置和复合类型,。。。。。。。。。(在局部作用域,在全局作用域中,。。。。。。。。。。。。)
某某规则的依据:如果一个类在某种情况下需要控制对象的初始化,则该类很可 能在所有的情况下都需要控制。
汗!c++中的“合成的构造函数” 原来是这样理解的,“编译器自动生成的构造函数” 。
/默认构造函数的形参列表中没有形参?错
所有形参都提供了默认默认实参的构造函数也定义了默认构造函数,而这样的构造函数形参列表中是有形参的。
隐式类类型转化--
调用一个形参的构造函数定义了形参类型到该类类型的一种转化。
关于接受一个形参的构造函数应该为explicit :
优点:。。。。。。。
缺点:。。。。。。。
为转化而显式地使用构造函数。
类成员的显式初始化:
条件:其全体数据成员均为public。
约束:根据数据成员的声明顺序来使用初始化。
缺点:1,2,3点。。。。。
malloc 和 new 至少有两个不同:
- new 返回指定类型的指针,并且可以自动计算所需要大小。
- malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
内存管理:
虚拟内存,
分段,分页,分块,段页
。。。。。。
关于那些static的使用:(与java的那些不同)
当我们在类的外部定义static成员时,无须重复指定static 保留字。
static 函数 没有this指针
static 数据成员 必须在类定义的外部定义。像普通的数据成员一样,不能在类的定义体中初始化。必须在static数据成员定义时初始化。
特例:特殊的整型 const static成员。
整型 const static 数据成员就可以在类定义体中进行初始化。
|||||||||||||||static vector<double> vec(vecSize);||||||||||||||||||||||||||||||
extern 使用
使用在变量与函数前,表明变量或者函数在别的文件中定义了,当编译器遇到这些变量时自动到其他模块寻找。
http://hi.baidu.com/ice_water/blog/item/2119a06ef9ee27d281cb4a9a.html
sizeof 这个特殊的“预处理”的使用,编译时确定。sizeof 结果是编译时的常量。
http://www.cnblogs.com/thepiece/archive/2010/03/08/1680656.html
深入理解计算机系统之存储器层次结构
高速缓存的结构描述形式:(S,E,B,m)
S是组数
E是每个组的行数
B是块大小(字节)
m = log(M) (主存)物理地址位数
高速缓存的大小(或者容量)C指的是所有块的大小的和,标记位和有效位不包括在内,C=S*E*B,
PS:这里的C指不包括像有效位和标记位这样开销的高速缓存大小(字节)
============不提细节
高速缓存的种类(根据每个组中的行数E)
- 直接映射高速缓存(常考点:E=1)
- 这种类型的高速缓存存在一个问题是:抖动现象
- 抖动现象指:高速缓存反复地加载和驱逐缓存块相同的组(程序员需注意的地方)
- 组相联高速缓存(E>1)
- 全相联高速缓存(只有1个组:S=1,物理地址就没有s这个索引组位)
回写和直写
回写解决的问题:直写中每条存储指令都会引起总线上的一个写事务。
回写的特点:尽可能地推迟存储器的更新,只有当替换算法要驱逐已更新的块时才把它写到存储器。
高速缓存友好的代码
基本方法
1,让最常见的情况运行得快。
2,在每个循环内部使缓存不命中数量最小。
对局部变量的反复引用是好的,因为编译器能够将它们缓存在寄存器堆中(时间局部性)
步长为1的引用模式是好的,因为存储器层次结构中所有的层次上的缓存都是将数据存储为连续的块(空间局部性)。
而对于多维数组进行操作的程序中,空间局部性尤其重要。
综合:高速缓存对程序性能的影响
- 存储器山()
- 重新排列循环以提高空间局部性
- 使用分块来提高时间局部性