C程序存储空间分布

      某实习笔试曾考程序的存储空间分布:

                    high addess

command argument

&environment variable 

stack (grows down)




heap (grows up)

uninitail data

initial data

program (程序正文段)

       low address


1.Program can be shared by multiple process.(多个进程共享,打开几个notepad,它们是共享同一份二进制代码的)

2.Initial data is the varible which  must be initial explicitly.Such as   int  cnt = 100 ; which is declared out of any function.(必须显式初始化的数据)

3.Unitial data is the varible which will be initialed to 0 or null pointer by the core,such as int cnt; which is declared out of any function.

(系统默认在程序开始执行前进行初始化的数据,函数体内的变量是不会自动初始化的,函数体外会自动初始化为0或空指针,且做正确类型的赋值,则整数就赋值0,指针就赋值null,题外话:calloc()函数则不会做正确的赋值)

4.Heap grows up,used to allocate the space when the program running.(动态分配)

5. Stack grows down,auto variable and some temp variable are her.

(自动变量和函数调用的一些信息:返回地址、调用者环境信息等,需要说明的是,递归调用在每次对应自身是,会使用一个新的帧,各自不影响)

6.Command line argument just like : int main(int argc ,char * argv[] )  {return 0;}

   And every program has a environment variables table.

(命令行参数和环境变量放在高地址,环境表是每个程序都用的,之前写CGI程序,就是通过环境变量来处理请求响应的)


存储空间分布复杂是指在设计数据结构或算法时,需要考虑数据元素在物理内存中的高效组织和访问,以充分利用内存空间并提高程序性能。对于这种情况,我们通常关注以下几个方面: 1. **动态分配与回收**:如链表和树结构,它们可以根据需求动态地增加或减少节点,避免预先为每个元素分配固定的空间,节省空间同时保持灵活性。 2. **压缩编码**:例如霍夫曼编码或Run-Length Encoding等,对频繁的数据模式进行压缩存储,减少无用空隙。 3. **分块存储**:比如B树或B+树,数据分布在多个连续或非连续的区域,通过索引来快速定位,适用于大规模数据存储。 4. **局部性和缓存优化**:算法应尽可能利用CPU缓存来减少访问主存的次数,如散列表和数组的连续存储能提高缓存命中率。 5. **哈希表**:哈希表使用散列函数将键映射到存储桶,理论上能提供接近O(1)的查找时间,但在处理大量冲突时需考虑扩容和负载因子。 6. **数据流和序列化**:对于一次性读取但需要多次处理的数据,使用序列化技术(如protobuf或json)可以将数据紧凑存储,减少内存占用。 7. **空间换时间的设计**:有时为了减少临时数据的存储,可以牺牲一些计算步骤,通过预计算部分结果来换取空间效率。 8. **数据密集型 vs 算法密集型**:针对大数据集,可以选择数据密集型算法,如归并排序,而不是算法密集型(如递归),因为数据传输的时间可能超过计算时间。 在实际应用中,需要根据具体场景和硬件特性选择最适合的策略,平衡空间和时间的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值