Iphone 通过适当的数据类型优化内存使用

Iphone 通过适当的数据类型优化内存使用,iphone,objective-c,Iphone,Objective C,全部, 我已经做了10年的Java开发人员……在管理数字数据方面,我大部分时间都坚持使用int,在需要小数精度时使用double。原因是我们几乎有一个很大的堆空间来处理,并且在大多数情况下很难耗尽它 我正在开始iPhone开发(我确实有一些C编程知识),考虑到设备本身的资源少于典型的JavaEE应用程序,我想知道是否应该开始考虑使用适当的数据类型 例如,我有一个具有一些数值属性的对象(我们将此属性称为“状态”)。该属性的值可能只有-10到10。最初,我使用int定义此属性,但现在我决定使用cha

全部,

我已经做了10年的Java开发人员……在管理数字数据方面,我大部分时间都坚持使用
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;太尴尬了!)