精华内容
下载资源
问答
  • f4 f3 f2 f1 由低地址到高地址按字节排列 u.i占据了整个数据大小 u.a仅仅占用前面一个字节f4,这样懂了么?所以u.a强制转换后输出16进制就是f4。 u.a是个char型数据只占8位,将他强制转换成int的意义是什么?不是从...
    #include <iostream>
    using namespace std;
    
    union
    {
     unsigned char a;
     unsigned int  i;
    }u;
    
    int main()
    {
     u.i = 0xf1f2f3f4;
     cout<<hex<<u.i<<endl;
     cout<<hex<<int(u.a)<<endl;
     return 0;
    }
    谁能告诉我int(u.a)的输出结果为什么是"f4"?
    先你要知道C语言处理union的方法,虽然是有两个定义,但是都是在内存的同一个地方的,但是int长度为32位(跟系统有关,我们按照32位来算),char仅为8位,所以u在内存中实际就是0xf1f2f3f4,用个简图来表示吧
       f4 f3 f2 f1 由低地址到高地址按字节排列
    u.i占据了整个数据大小
    u.a仅仅占用前面一个字节f4,这样懂了么?所以u.a强制转换后输出16进制就是f4。
    u.a是个char型数据只占8位,将他强制转换成int的意义是什么?不是从内存里面扩充,只是从数据类型上面扩充,将8位数据扩充成32位,用0填充
    union联合体是指里面定义的各种数据共享一块内存地址,而结构体的实际长度以其中占据内存空间最大的变量计
    比如该例,unsigned char 是一个字节,而unsigned int是四个字节,因此u的实际大小是4个字节,而根据高位数据占据高地址,低位数据占据低位地址的原则,u.a这个字符数据占据的是u.i的低1/4地址,在例中就是f4
     
    展开全文
  • 编程中,需要使用到union联合体,不清楚到底在内存中是怎么对应的,所以写了个测试的函数,进行测试了下。发现bit位按照定义,定义在前的为实际的低位 #include typedef unsigned long u32; typedef unsigned ...

    编程中,需要使用到union联合体,不清楚到底在内存中是怎么对应的,所以写了个测试的函数,进行测试了下。发现bit位按照定义,定义在前的为实际的低位

    #include <stdio.h>
    
    typedef unsigned long  u32;
    typedef unsigned short u16;
    
    typedef struct  {      // bits description
       u16 DI0:1;          // 0    
       u16 DI1:1;          // 1    
       u16 DI2:1;          // 2    
       u16 DI3:1;          // 3    
       u16 DI4:1;          // 4    
       u16 DI5:1;          // 5  
       u16 DI6:1;          // 6   
       u16 DI7:1;          // 7
       u16 DI8:1;          // 8    
       u16 DI9:1;          // 9    
       u16 DI10:1;         // 10    
       u16 DI11:1;         // 11  
       u16 DI12:1;         // 12   
       u16 DI13:1;         // 13
                 
       u16 rsvd:2;     // 15:14 reserved
    }DIREG_BITS;
    
    typedef union  {
       u16  all;
       DIREG_BITS  	bit;
    }DI_REG;
    
    int main()
    {
    	DI_REG di_reg;
        di_reg.bit.DI0 = 1;
        di_reg.bit.DI1 = 0;
        di_reg.bit.DI2 = 0;
        di_reg.bit.DI3 = 0;
        di_reg.bit.DI4 = 0;
        di_reg.bit.DI5 = 0;
        di_reg.bit.DI6 = 0;
        di_reg.bit.DI7 = 0;
        di_reg.bit.DI8 = 0;
        di_reg.bit.DI9 = 0;
        di_reg.bit.DI10 = 0;
        di_reg.bit.DI11 = 1;
        di_reg.bit.DI12 = 1;
        di_reg.bit.DI13 = 1;
        printf("di_reg.all = %d\n",di_reg.all);
    	sleep(50000);
    	return 0;
    }
    

    测试结果:打印结果为14437



    10进制14337转换为2进制为:11100000000001。

    至此解决了,在编程过程中的顺序对应问题。


    展开全文
  • 进程的内存空间布局

    千次阅读 2018-05-09 08:56:01
    进程的内存布局在结构上是有规律的,对于 linux 系统上的进程,其内存空间一般可以粗略地分为以下几大段,从高内存到低内存排列:1、内核态内存空间,其大小一般比较固定(可以编译时调整),但 32 位系统和 64 位...

    进程的内存布局在结构上是有规律的,对于 linux 系统上的进程,其内存空间一般可以粗略地分为以下几大段,从高内存到低内存排列:

    1、内核态内存空间,其大小一般比较固定(可以编译时调整),但 32 位系统和 64 位系统的值不一样。

    2、用户态的栈,大小不固定,可以用ulimit -s 进行调整,默认一般为 8M,从高地址向低地址增长。

    3、mmap区域(内存映射段),既可以从高地址到低地址延伸(所谓 flexible layout),也可以从低到高延伸(所谓 legacy layout),看进程具体情况。

    4、brk 区域(堆),紧邻数据段(甚至贴着),从低位向高位伸展,但它的大小主要取决于 mmap 如何增长,一般来说,即使是 32 位的进程以传统方式延伸,也有差不多 1 GB 的空间。

    5、数据段,主要是进程里初始化和未初始化(BSS)的全局数据总和,当然还有编译器生成一些辅助数据结构等等),大小取决于具体进程,其位置紧贴着代码段。

    6、代码段,主要是进程的指令,包括用户代码和编译器生成的辅助代码,其大小取决于具体程序,但起始位置根据 32 位还是 64 位一般固定(-fPIC, -fPIE等除外)。

    以上各段(除了代码段数据段)其起始位置根据系统是否起用 randomize_va_space 一般稍有变化,各段之间因此可能有随机大小的间隔,千言万语不如一幅图(x86-32位下):


    展开全文
  • 腾讯面试题:10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G...
    腾讯面试题:10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。

    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。

    关于中位数:数据排序后,位置在最中间的数值。即将数据分 成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。

    分析:明显是一道工程性很强的题目,和一般的查找中位数的题目有几点不同。
    1. 原数据不能读进内存,不然可以用快速选择,如果数的范围合适的话还可以考虑桶排序或者计数排序,但这里假设是32位整数,仍有4G种取值,需要一个16G大小的数组来计数。

    2. 若看成从N个数中找出第K大的数,如果K个数可以读进内存,可以利用最小或最大堆,但这里K=N/2,有5G个数,仍然不能读进内存。

    3. 接上,对于N个数和K个数都不能一次读进内存的情况,《编程之美》里给出一个方案:设k<K,且k个数可以完全读进内存,那么先构建k个数的堆,先 找出第0到k大的数,再扫描一遍数组找出第k+1到2k的数,再扫描直到找出第K个数。虽然每次时间大约是nlog(k),但需要扫描ceil(K/k) 次,这里要扫描5次。

    解法:首先假设是32位无符号整数。
    1. 读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。
    说 明:整数范围是0 - 2^32 - 1,一共有4G种取值,映射到256M个区段,则每个区段有16(4G/256M = 16)种值,每16个值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256M段。一个64位无符号整数最大值是0~8G-1,这里先不考虑溢出的情况。总共占用内存256M×8B=2GB。

    2. 从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。

    3. 再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。

    4. 对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。

    总结:
    1.以上方法只要读两遍整数,对每个整数也只是常数时间的操作,总体来说是线性时间。

    2. 考虑其他情况。
    若是有符号的整数,只需改变 映射即可。若是64为整数,则增加每个区段的范围,那么在第二次读数时,要考虑更多的计数。若过某个计数溢出,那么可认定所在的区段或代表整数为所求,这 里只需做好相应的处理。噢,忘了还要找第5G+1大的数了,相信有了以上的成果,找到这个数也不难了吧。

    3. 时空权衡。
    花费256个区段也许只是恰好配合2GB的内存(其实也不是,呵呵)。可以增大区段范围,减少区段数目,节省一些内存,虽然增加第二部分的对单个数值的计数,但第一部分对每个区段的计数加快了(总体改变??待测)。

    4. 映射时尽量用位操作,由于每个区段的起点都是2的整数幂,映射起来也很方便。

    答案:

    1, 把整数分成256M段,每段可以用64位整数保存该段数据个数,256M*8 = 2G内存,先清0 

    2,读10G整数,把整数映射到256M段中,增加相应段的记数 

    3,扫描256M段的记数,找到中位数的段和中位数的段前面所有段的记数,可以把其他段的内存释放 

    4,因中位数段的可能整数取值已经比较小(如果是32bit整数,当然如果是64bit整数的话,可以再次分段),对每个整数做一个记数,再读一次10G整数,只读取中位数段对应的整数,并设置记数。 

    5,对新的记数扫描一次,即可找到中位数。 

    如果是32bit整数,读10G整数2次,扫描256M记数一次,后一次记数因数量很小,可以忽略不记
    (设是32bit整数,按无符号整数处理 
    整数分成256M段? 整数范围是0 - 2^32 - 1 一共有4G种取值,4G/256M = 16,每16个数算一段 0-15是1段,16-31是一段,... 
    整数映射到256M段中? 如果整数是0-15,则增加第一段记数,如果整数是16-31,则增加第二段记数,... 
    其实可以不用分256M段,可以分的段数少一写,这样在扫描记数段时会快一些,还能节省一些内存)

    展开全文
  • 如题 “在一个文件中有 10G 个整数,乱序排列,要求找出中位数(内存限制为 2G)”  假设整数用32bit来表示。 第一步:要表示10G大小的数字,最少需要一个64位的数据空间。(10G = 5 * 2^31 &gt; 2^32 )  假如...
  • 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 关于中位数...
  • 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存
  • 深入理解Java虚拟机-Java内存区域与内存溢出异常

    万次阅读 多人点赞 2020-01-03 21:42:24
    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来。 文章目录概述运行时数据区域程序计数器(线程私有)Java虚拟机栈(线程私有)局部变量表操作数栈动态链接...
  • 日期 内核版本 架构 作者 GitHub CSDN 2016-08-31 ... Linux内存管理 1 前景回顾前面我们讲到服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA)1.1 UMA和NUMA两种模型共享存储型多处理机有两种模型
  • Java内存区域与内存溢出

    千次阅读 2020-02-09 17:27:55
    在C语言中,开发者需要维护对象的出生和死亡,往往需要为每个new出来的对象编写配套的delete/free代码来释放内存,否则可能发生内存泄漏或溢出。 而在Java中,内存由JVM管理,垃圾回收器GC会帮助开发者自动回收不再...
  • 翻译实现下一个排列,将...重排必须在原地,不分配额外的内存。这里有些例子。输入是在左侧列和与其对应的输出在右侧列。 1,2,3→1,3,2 3,2,1→1,2,3 1,1,5→1,5,1原文Implement next permutation, which rearranges
  • 内存对齐详解

    万次阅读 多人点赞 2013-01-16 17:38:02
    内存地址对齐,是一种在计算机内存排列数据(表现为变量的地址)、访问数据(表现为CPU读取数据)的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 。 为什么需要内存对齐?对齐...
  • 穷举所有排列

    千次阅读 2018-09-21 16:14:45
    时限:100ms 内存限制:10000K 总时限:300ms 描述 输入一个小于10的正整数n,按把每个元素都交换到最前面一次的方法,输出前n个小写字母的所有排列。   输入 输入一个小于10的正整数n。   输出 按把每个...
  • linux内核虚拟内存之物理内存

    千次阅读 2017-09-15 11:41:58
    linux虚拟内存之物理内存描述
  • #内存泄露# linux常用内存相关命令

    万次阅读 2020-06-19 11:14:34
     free 命令会显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存等。 $ free total used free shared buff/cache available Mem: 8047480 6142828 154116 465584 1750536 1078080 Swap: ...
  • 排列组合算法

    千次阅读 2019-06-07 10:09:05
    命题:多维数组的排列组合 或 多个数组之间的排列组合 命题场景: 现在有一批手机,其中颜色有[‘白色’,‘黑色’,‘金色’];内存大小有[‘16G’,‘32G’,‘64G’],版本有[‘移动’,‘联通’,‘电信’],...
  • java图书排列

    千次阅读 2020-05-23 17:29:59
    标题:图书排列 将编号为1~10的10本书排放在书架上,要求编号相邻的书不能放在相邻的位置。 请计算一共有多少种不同的排列方案。 注意,需要提交的是一个整数,不要填写任何多余的内容。 9 9 10 9 9 9 9 9 9 10 7 7 ...
  • 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 关于中
  • 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 ...在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换
  • Java应用程序是运行在JVM上的,得益于JVM的内存管理和垃圾收集机制,开发人员的效率得到了显著提升,也不容易出现内存溢出和泄漏问题。但正是因为开发人员把内存的控制权交给了JVM,一旦出现内存方面的问题,如果不...
  • Java实现 蓝桥杯VIP 算法训练 排列问题

    万次阅读 多人点赞 2019-06-20 22:46:44
    时间限制:1.0s 内存限制:512.0MB 问题描述  求一个0~N-1的排列(即每个数只能出现一次),给出限制条件(一张N*N的表,第i行第j列的1或0,表示为j-1这个数不能出现在i-1这个数后面,并保证第i行第i列为0),将这...
  • 排列组合 dfs

    千次阅读 2013-08-03 10:48:42
    组合数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 ...描述找出从自然数1、2、......特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。 样例输入 5 3 样例输出 543 542 541
  • 内存泄露的危害: (1)过多的内存泄露最终会导致内存溢出(OOM)(2)内存泄露导致可用内存不足,会触发频繁GC,不管是Android2.2以前的单线程GC还是现在的CMS和G1,都有一部分的操作会导致用户线程停止(就是所谓...
  • 这里存在一个问题,如果数组类型是int,能够计数的最大值是2^32=4G,而如果10G个整数完全相同,则int类型表示不了10G个数,所以这里数组类型采用long long 8字节类型,占用内存为2^16*8B=518KB,远小于提供的2G内存,...
  • 在进入讲解主题“-栈内存与堆内存的区别”之前,先来讲解一下数组,所谓数组,就是若干个相同数据类型的元素按一定顺序排列的集合。 一维数组的定义: 数据类型[ ] 数组名; 数组名 = new 数据类型[个数]; 针对于...
  • 1013: 字母排列

    千次阅读 2016-08-10 19:14:54
    时间限制: 10 Sec 内存限制: 128 MB 提交: 247 解决: 148 [提交][状态][讨论版] 题目描述 编写一个程序,当输入不超过200个字符组成的英文文字时,计算机将这个句子中的字母按英文字典字母顺序重新排列排列后的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,260
精华内容 90,904
关键字:

内存排列