Iphone 通过适当的数据类型优化内存使用
全部, 我已经做了10年的Java开发人员……在管理数字数据方面,我大部分时间都坚持使用Iphone 通过适当的数据类型优化内存使用,iphone,objective-c,Iphone,Objective C,全部, 我已经做了10年的Java开发人员……在管理数字数据方面,我大部分时间都坚持使用int,在需要小数精度时使用double。原因是我们几乎有一个很大的堆空间来处理,并且在大多数情况下很难耗尽它 我正在开始iPhone开发(我确实有一些C编程知识),考虑到设备本身的资源少于典型的JavaEE应用程序,我想知道是否应该开始考虑使用适当的数据类型 例如,我有一个具有一些数值属性的对象(我们将此属性称为“状态”)。该属性的值可能只有-10到10。最初,我使用int定义此属性,但现在我决定使用cha
int
,在需要小数精度时使用double
。原因是我们几乎有一个很大的堆空间来处理,并且在大多数情况下很难耗尽它
我正在开始iPhone开发(我确实有一些C编程知识),考虑到设备本身的资源少于典型的JavaEE应用程序,我想知道是否应该开始考虑使用适当的数据类型
例如,我有一个具有一些数值属性的对象(我们将此属性称为“状态”)。该属性的值可能只有-10到10。最初,我使用int
定义此属性,但现在我决定使用char
。原因是我不需要太多的位来表示-10到10之间的值…所以char
是我需要的最小值。不幸的是,当有人看到一个char
时,他们可能会认为是字符,但我把它当作一个数字。我担心如果我坚持使用char
,可能会引起一些混乱
鉴于此代码片段:
-(void)doSomething:(char)value {
state = value;
}
然后调用它,例如:
[myObject doSomething:1];
我的问题是,我是否应该担心以这种方式优化数据类型?我需要开始检查溢出和抛出错误吗?还是这是一个完美的编程
谢谢
编辑:我想我不应该在我的问题中使用名称
state
。我在这里没有特别的枚举,因为我对这个值进行计算,并根据需要更新状态。它恰好有一个固定的范围。虽然这是完全可以接受的,(我通常是这样做的),除非一行中有多个字符,否则对齐问题将迫使下一个变量浪费1-3个字节,否则可以由int免费使用。我鼓励您研究对齐,在这里解释+的后果相当简单,但有点冗长。无论如何,为了避免混淆(虽然我怀疑会有很多混淆,但基本上每个都有自己的混淆),您可能希望使用int8_t或键入为签名字符的int8_t
编辑:我以前忘记了:MacOS上的malloc实现(也是iOS的基础)只返回16字节或更长的内存块,四舍五入。因此,如果你的对象占用15个字节,那么你也在浪费一个字节,如果它占用17个字节,那么你就在浪费15个字节。虽然这是完全可以接受的,(我通常是这样做的)除非一行中有多个字符,否则对齐问题将迫使下一个变量浪费1-3个字节,我鼓励您研究对齐方式,它相当简单,但在这里解释+结果有点冗长。无论如何,为了避免混淆(虽然我怀疑会有很多混淆,但基本上每个都有自己的混淆),您可能希望使用int8_t或键入为签名字符的int8_t
编辑:我以前忘记了:MacOS上的malloc实现(也是iOS的基础)只返回16字节或更长的内存块,四舍五入。因此,如果您的对象占用15个字节,那么您也在浪费一个字节,如果占用17个字节,那么您就在浪费15个字节。在这种情况下,我通常使用包含所有有效值的typedef枚举:
typdef enum {
kMyStateOne,
kMyStateTwo
} MyStates;
然后写下这样的方法:
-(void)doSomething:(MyStates)value {
state = value;
}
因此,代码的用户知道如何使用:
[myObject doSomething:kStateOne];
这样,如果编译器向您传递了任何其他内容,您将收到编译器的投诉。在这种情况下,我通常使用包含所有有效值的typedef枚举:
typdef enum {
kMyStateOne,
kMyStateTwo
} MyStates;
然后写下这样的方法:
-(void)doSomething:(MyStates)value {
state = value;
}
因此,代码的用户知道如何使用:
[myObject doSomething:kStateOne];
这样一来,如果编译器向您传递任何其他信息,您将收到编译器的投诉。除非您要创建大量此数值属性的副本,否则即使在iPhone上,空间也不是真正的问题。更重要的是学习内存管理和基础数据类型(NSCORT,NSCORE,NSCODE等)< P>除非你将要创建大量的数字属性副本,空间甚至不是真正的问题,即使是在iPhone上。更重要的是学习内存管理和基础数据类型(NSCORT,NSCORE,NSCODE等)正常情况下,我将使用枚举……但这不适用于我的情况,我没有很好地阐明……我用更多的细节编辑了我的问题……通常,我会使用枚举…但这不适用于我的情况,我没有很好地阐明这一点…我用更多的细节编辑了我的问题…我只使用int,不担心微优化。我只使用int,不担心微优化。耶…当我用谷歌搜索内存对齐时,我的头爆炸了…在我的脑海中,我只是把这个概念和文件和集群大小联系起来…希望泛化就足够了…@Jason-你完全正确(我自己一直坚持使用char,没有先签入Xcode;多么尴尬!)耶…当我在谷歌上搜索内存对齐时,我的头爆炸了…在我的脑海里,我只是把这个概念和文件和集群大小联系起来……希望泛化就足够了……@Jason-你完全正确(我自己一直坚持使用char,没有先签入Xcode;太尴尬了!)