convert app to 64-bit for ios7
2013-10-21 17:40 三戒1993 阅读(107) 评论(0) 编辑 收藏 举报convert app to 64-bit for ios7
https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40013501-CH1-SW1
Integer data type |
ILP32 size |
ILP32 alignment |
LP64 size |
LP64 alignment |
---|---|---|---|---|
|
1 byte |
1 byte |
1 byte |
1 byte |
|
1 byte |
1 byte |
1 byte |
1 byte |
|
2 bytes |
2 bytes |
2 bytes |
2 bytes |
|
4 bytes |
4 bytes |
4 bytes |
4 bytes |
|
4 bytes |
4 bytes |
8 bytes |
8 bytes |
|
8 bytes |
4 bytes |
8 bytes |
8 bytes |
pointer |
4 bytes |
4 bytes |
8 bytes |
8 bytes |
|
4 bytes |
4 bytes |
8 bytes |
8 bytes |
|
4 bytes |
4 bytes |
8 bytes |
8 bytes |
|
4 bytes |
4 bytes |
8 bytes |
8 bytes |
|
8 bytes |
4 bytes |
8 bytes |
8 bytes |
|
8 bytes |
4 bytes |
8 bytes |
8 bytes
|
Floating-point type |
ILP32 size |
LP64 size |
---|---|---|
|
4 bytes |
4 bytes |
|
8 bytes |
8 bytes |
4 bytes |
8 bytes
|
数据类型改变:
指针类型由4字节改为8字节;
long,size_t,NSInteger,CFIndex 变为8字节;
CGFloat 由4字节变为8字节。
Summary
At a high level, to make your code 64-bit clean, you must do the following:
-
Avoid assigning 64-bit
long
integers to 32-bit integers. -
Avoid assigning 64-bit pointers to 32-bit integers.
-
Avoid pointer and
long
integer truncation during arithmetic operations (or other arithmetic problems caused by the change in integer types). -
Fix alignment issues caused by changes in data type sizes. (内存对齐问题)
-
Ensure that memory structures that are shared between the 32-bit and 64-bit runtimes share a similar layout.
-
Rewrite any assembly language code so that your code uses the new 64-bit opcodes and runtime.
-
Avoid casting variadic functions to functions that take a fixed number of parameters, or vice versa.(变参函数 和 定参函数之间的转换)
Common Memory Usage Problems
1 Foundation Objects May Be Expensive for Small Payloads 使用NSDictionary、NSArray等对象保存少量数据时耗费更多的内存。
2 Choose a Compact Data Representation 使用紧凑的数据结构,少一些变量(一些变量可以由某个变量计算得出)
3 Pack Data Structures 注意内存对齐问题,编译器可能会添加额外的补齐空间。
4 Use Fewer Pointers 64-bit 中指针占用更多的内存空间。
5 Memory Allocations Are Padded to Preserve Alignment
When allocating memory for C structs, it may be more efficient for you to allocate a few large blocks of memory instead of allocating memory for each individual struct.
6 Cache Only When You Need To
Converting Your App to a 64-Bit Binary
1 Do Not Cast Pointers to Integers
2 Use Data Types Consistently
使用数据类型要保持一致。
枚举也是有类型的。
NSIntger,CGFloat 已经变成64位了,与int、float进行计算时要注意。
3 Be Careful When Performing Integer Computations
注意有符号和无符号数:有符号数和无符号数进行计算得到的结果是无符号的;
-
Unsigned values are zero extended (not sign extended) when promoted to a larger type.(无符号数 转换成更大的类型时 用0补齐额外的位数)
-
Signed values are always sign extended when promoted to a larger type, even if the resulting type is unsigned.(有符号数 转换成更大的类型时 用符号位补齐额外的位数)
-
Constants (unless modified by a suffix, such as
0x8L
) are treated as the smallest size that will hold the value. Numbers written in hexadecimal may be treated by the compiler asint
,long
, andlong long
types and may be eithersigned
orunsigned
types. Decimal numbers are always treated assigned
types.(常量的对待,十进制为有符号数) -
The sum of a signed value and an unsigned value of the same size is an unsigned value.
位操作Bits and Bitmasks:
-
If you want the mask value to contain zeros in the upper 32 bits in the 64-bit runtime, the usual fixed-width mask works as expected, because it will be extended in an unsigned fashion to a 64-bit quantity.
-
If you want the mask value to contain ones in the upper bits, write the mask as the bitwise inverse of its inverse
4 Create Data Structures with Fixed Size and Alignment
使用明确长度的int类型:
Type |
Range |
---|---|
int8_t |
-128 to 127 |
int16_t |
-32,768 to 32,767 |
int32_t |
-2,147,483,648 to 2,147,483,647 |
int64_t |
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
uint8_t |
0 to 255 |
uint16_t |
0 to 65,535 |
uint32_t |
0 to 4,294,967,295 |
uint64_t |
0 to 18,446,744,073,709,551,615 |
5 Allocate Memory Using sizeof
6 Update Format Strings to Support Both Runtimes
7 Take Care with Functions and Function Pointers
8 Use the Built-in Synchronization Primitives
9 Never Hard-Code the Virtual Memory Page Size
10 Go Position Independent
11 Don’t Forget your 32-bit Version
12 Make Your App Run Well in the 32-Bit Runtime