sizeof

Ehcache计算Java对象内存大小

最后都变了- 提交于 2020-03-24 06:25:00
在EHCache中,可以设置maxBytesLocalHeap、maxBytesLocalOffHeap、maxBytesLocalDisk值,以控制Cache占用的内存、磁盘的大小(注:这里Off Heap是指Element中的值已被序列化,但是还没写入磁盘的状态,貌似只有企业版的EHCache支持这种配置;而这里maxBytesLocalDisk是指在最大在磁盘中的数据大小,而不是磁盘文件大小,因为磁盘文中有一些数据是空闲区),因而EHCache需要有一种机制计算一个类在内存、磁盘中占用的字节数,其中在磁盘中占用的字节大小计算比较容易,只需要知道序列化后字节数组的大小,并且加上一些统计信息,如过期时间、磁盘位置、命中次数等信息即可,而要计算一个对象实例在内存中占用的大小则要复杂一些。 计算一个实例内存占用大小思路 在Java中,除了基本类型,其他所有通过字段包含其他实例的关系都是引用关系,因而我们不能直接计算该实例占用的内存大小,而是要递归的计算其所有字段占用的内存大小的和。在Java中,我们可以将所有这些通过字段引用简单的看成一种树状结构,这样就可以遍历这棵树,计算每个节点占用的内存大小,所有这些节点占用的内存大小的总和就当前实例占用的内存大小,遍历的算法有:先序遍历、中序遍历、后序遍历、层级遍历等。但是在实际情况中很容易出现环状引用(最简单的是两个实例之间的直接引用

VC++中内存对齐

不想你离开。 提交于 2020-03-24 03:01:27
我们经常看到求 sizeof(A) 的值的问题,其中A是一个结构体,类,或者联合体。 为了优化CPU访问和优化内存,减少内存碎片,编译器对内存对齐制定了一些规则。但是,不同的编译器可能有不同的实现,本文只针对VC++编译器,这里使用的IDE是VS2012。 #pragma pack()是一个预处理,表示内存对齐。布局控制#pragma,为编译程序提供非常规的控制流信息。 /**********结构体的大小的规则*************/ 结构体大小是处理器位数和结构体内最长数据元素所占字节数二者中较小的那一个的整数倍。 比如说,假设处理器位数为n,结构体内最大数据元素所占字节数为m。 处理器为32位,n = 4;结构体内最大数据类型为short,m = 2; n > m;结构体大小为m的整数倍,反之亦然。 注意:有些虽然是64位的操作系统,但是编译器却是32位的,此时位数为32. 1 class A{ 2   int a; 3   char b; 4   short c; 5 }; sizeof(A)为8,为4的整数倍。 1 struct B{ 2 short a; 3 short b; 4 short c; 5 }; sizeof(B)为6,为2(sizeof(short))的整数倍。 注意:C++中的结构体与类只有一个区别,就是结构体成员默认是public

iOS分类底层实现原理小记

廉价感情. 提交于 2020-03-23 02:30:38
摘要:iOS分类底层是怎么实现的?本文将分如下四个模块进行探究分类的结构体编译时的分类分类的加载总结本文使用的runtime源码版本是objc4-680文中类与分类代码如下//类@interfacePerson:NSObject@property(nonatomic,copy)NSString*presonName;@end@implementationPerson-(void)doSomeThing{NSLog(@"Person");}@end//分类@int iOS 分类底层是怎么实现的? 本文将分如下四个模块进行探究 分类的结构体 编译时的分类 分类的加载 总结 本文使用的runtime源码版本是 objc4 - 680 文中类与分类代码如下 //类 @interface Person : NSObject @property (nonatomic ,copy) NSString *presonName; @end @implementation Person - (void)doSomeThing{ NSLog(@"Person"); } @end // 分类 @interface Person(categoryPerson) @property (nonatomic ,copy) NSString *categoryPersonName; @end

Qt实现 QQ好友列表QToolBox

那年仲夏 提交于 2020-03-22 14:36:21
简述 QToolBox类提供了一个列(选项卡式的)部件条目。 QToolBox可以在一个tab列上显示另外一个,并且当前的item显示在当前的tab下面。每个tab都在tab列中有一个索引位置。tab的item是一个QWidget 。 简述 详细描述 使用 效果 源码 详细描述 每个item都有一个itemText()、一个可选的itemIcon()、一个可选的itemToolTip()、和一个widget()函数 。item的属性可以通过setItemText()、setItemIcon()、和setItemToolTip()来改变,并且每个item可以通过setItemEnabled()单独设置为是否可用。 Item的添加使用addItem(),或通过insertItem()在特定位置插入。如果要获取items的总数,可以调用count()函数。Item可以使用removeItem()从toolbox中删除。结合removeItem()和insertItem(),允许你将item移动到不同的位置。 当前item部件的索引由currentIndex()返回,并使用setCurrentIndex()来设置。一个特定item的索引可以使用indexOf()来获取,item()则返回给定索引的item。 当前的item发生变化时,会发射currentChanged()信号。 使用

四叉树空间索引原理及其实现

自古美人都是妖i 提交于 2020-03-22 11:37:40
转自原文 四叉树空间索引原理及其实现 四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割。四叉树的结构比较简单,并且当空间数据对象分布比较均匀时,具有比较高的空间数据插入和查询效率,因此四叉树是GIS中常用的空间索引之一。常规四叉树的结构如图所示,地理空间对象都存储在叶子节点上,中间节点以及根节点不存储地理空间对象。 四叉树示意图 四叉树对于区域查询,效率比较高。但如果空间对象分布不均匀,随着地理空间对象的不断插入,四叉树的层次会不断地加深,将形成一棵严重不平衡的四叉树,那么每次查询的深度将大大的增多,从而导致查询效率的急剧下降。 本节将介绍一种改进的四叉树索引结构。四叉树结构是自顶向下逐步划分的一种树状的层次结构。传统的四叉树索引存在着以下几个缺点: (1)空间实体只能存储在叶子节点中,中间节点以及根节点不能存储空间实体信息,随着空间对象的不断插入,最终会导致四叉树树的层次比较深,在进行空间数据窗口查询的时候效率会比较低下。 (2)同一个地理实体在四叉树的分裂过程中极有可能存储在多个节点中,这样就导致了索引存储空间的浪费。 (3)由于地理空间对象可能分布不均衡,这样会导致常规四叉树生成一棵极为不平衡的树,这样也会造成树结构的不平衡以及存储空间的浪费。 相应的改进方法

剑指offer学习

女生的网名这么多〃 提交于 2020-03-22 08:26:41
问:C++定义一个空的类型,里面没有任何的成员变量和成员函数。对该类型求sizeof,得到的结果是多少? 答: 是1. 因为空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。visual studio 中的每个空类型的实例占用1字节的空间。 如果在该类型中添加一个构造函数和析构函数,求得的sizeof的结果仍是1,因为,调用构造函数和析构函数只需要知道函数的地址即可。而这些函数的地址只与类型相关,而与类型的实例的无关,编译器也不会因为这两个函数而在实例内添加任何额外的信息。 如果把析构函数标记成虚函数的话,C++编译器会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。 在32位机子上,一个指针占4字节的空间,因此求sizeof得到4; 如果是64位机子,一个指针占8字节的空间,因此求得sizeof得到8; 问: class A { private : int value; public: A (int n) { value =n; } A(A other) { value=other.value ;} void Print( ) {std::cout<<value<<std::endl;} }; int_tmain(int argc

内存池

元气小坏坏 提交于 2020-03-21 19:57:59
http://blog.csdn.net/neustar1/article/details/7478311 利用C/C++开发大型应用程序中,内存的管理与分配是一个需要认真考虑的部分。 本文描述了内存池设计原理并给出内存池的实现代码,代码支持Windows和Linux,多线程安全。 内存池设计过程中需要考虑好内存的分配与释放问题,其实也就是空间和时间的矛盾。 有的内存池设计得很巧妙,内存分配与需求相当,但是会浪费过多的时间去查找分配与释放,这就得不偿失; 实际使用中,我们更多的是关心内存分配的速度,而不是内存的使用效率。基于此,本文按照如下思想设计实现内存池。 主要包含三个结构:StiaticMemory, MemoryChunk和MemoryBlock,三者之间的关系如下图所示: 1.内存的分配: (1)如果分配大小超过1024,直接采用malloc分配,分配的时候多分配sizeof(size_t)字节,用于保存该块的大小; (2)否则根据分配大小,查找到容纳该大小的最小size的MemoryChunk; (3)查找MemoryChunk的链表指针pList,找到空闲的MemoryBlock返回; (4)如果pList为NULL,临时创建MemoryBlock返回; (5)MemoryBlock头部包含两个成员,pChunk指向的所属的MemoryChunk对象,size表明大小

C++的sizeof

青春壹個敷衍的年華 提交于 2020-03-20 22:15:39
3 月,跳不动了?>>> sizeof运算符的结果部分地依赖于其作用的类型: 对char或者类型为char的表达式执行sizeof运算,结果为1。 对引用类型执行sizeof运算得到被引用对象所占空间的大小。 对指针执行sizeof运算得到指针本身所占空间的大小。 对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小。 对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有元素各执行一次sizeof运算并将所得结果求和。注意,sizeof运算不会把数组转换成指针来处理。 对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象总的元素占用了多少空间, 来源: oschina 链接: https://my.oschina.net/u/3235746/blog/3207368

C语言总结2

廉价感情. 提交于 2020-03-19 08:42:36
12).预处理指令 1. 什么叫做预处理代码. 以#开头的代码就是预处理代码 #warning #import 2. 手写1个C程序的步骤.(面试题) 1>编写代码 2>编译 1)执行.c中的预处理代码 2)检查语法 3>链接 4>执行 3. 预处理指令的分类.(面试题) ****** 1>文件包含指令 #include 2>宏定义 #define (用来替换代码) 3>条件编译 #if (满足一定的条件才编译) 4. 预处理指令的特点. 1>都是以#开头 2>后面没有分号 3>在编译的时候,检查语法之前进行 "注意 以#开头的代码就是预处理代码 13).sizeof运算符 sizeof运算符的作用? 作用:计算常量,变量在当前系统上内存中所占的字节数 sizeof (数据类型) sizeof (变量)-----用的最多! sizeof (常量) 注意, char类型的变量在内存中占1个字节; char类型的常量在内存中占4个字节; 综上所述,为了安全起见,sizeof后面最好加上括号! 14).按位异或 ^ 异或运算 不同为1,相同为0 注意: 1 相同整数相^的结果是0; 2 一个整数^另一个整数2次结果不变 ; 3^2^2 = 3 3 整数相^跟顺序无关 3^2^3 = 2^3^3 = 2 15). 按位左移或者右移 1,按位左移运算. << 参与按位左移运算的二进制数据.

sizeof()与内存对齐问题小探讨

强颜欢笑 提交于 2020-03-18 05:08:25
关于sizeof输出问题 看下面一个例子: int main() {   char *ss1 = "0123456789";   char ss2[] = "0123456789";    char ss3[100] = "0123456789";   //内存对齐问题   struct { int a; char b; int c; char d; }st1;   struct { int a[10]; char b; char c; }st2;   printf("length1: %d;length2: %d; length3: %d, length4: %d, length5: %d\n",sizeof(ss1),sizeof(ss2), \   sizeof(ss3), sizeof(st1),sizeof(st2));   return 0; } 结果为4,11,100,16,48. 因为ss1首先是一个指针变量,它指向一个字符串,而sizeof输出的是给它传递的变量的长度,因此结果是4; 而对ss2来说,它是一个数组,它的长度未定义,因此要根据字符串的长度来算,再加上一个结束'\0',因此是11; 对于ss3它是一个有固定长度100的字符串,因此输出100; 对于结构体变量st1,与st2来说,默认情况下,为了便于对结构体内元素的访问与管理