在C中,我们经常使用char来表示小数字。但是,处理器始终使用Int(或32位)值来读取(或取自)寄存器。因此,每次我们需要在程序处理器中使用char或8位时,需要从regsiter中获取32位并解析'它有8位。 因此,如果内存不是限制,更常使用Int代替char是否有意义? 它会帮助'处理器?
答案 0 :(得分:3)
有编译器部分和cpu部分。
如果你告诉编译器你使用的是char
而不是int
,那么在静态分析期间它会知道变量的界限在0-255而不是0-( 2 ^ 32-1)。这样可以更好地优化您的程序。
在cpu方面,你的假设并不总是正确的。以x86为例,它具有寄存器eax
和al
,用于32位和8位寄存器访问。如果您只想使用字符,使用al
就足够了。没有性能损失。
我做了一些简单的基准来回应以下评论:
人:
format PE GUI 4.0
xor ecx, ecx
dec ecx
loop_start:
inc al
add al, al
dec al
dec al
loopd short loop_start
ret
EAX:
format PE GUI 4.0
xor ecx, ecx
dec ecx
loop_start:
inc eax
add eax, eax
dec eax
dec eax
loopd short loop_start
ret
次:
$ time ./test_al.exe
./test_al.exe 0.01s user 0.00s system 0% cpu 7.102 total
$ time ./test_eax.exe
./test_eax.exe 0.01s user 0.01s system 0% cpu 7.120 total
因此,在这种情况下,al
略快一些,但有时eax
出现得更快。差异实际上可以忽略不计。但是cpus并不是那么简单,可能存在代码对齐问题,缓存和其他事情,所以最好对自己的代码进行基准测试,看看是否有任何性能提升。但是,如果您的代码不是非常严格,最好相信编译器来优化。
答案 1 :(得分:2)
如果我是你,我会坚持int
,因为这可能是您平台上最原生的整体类型。在内部,您可以期望将较短的类型转换为int
,从而实际降低性能。
您应该从不使用char
并期望它在不同平台上保持一致。虽然C标准将sizeof(char)
定义为1,但char
本身可以是signed
或unsigned
。选择取决于编译器。
如果您认为在使用8位类型时可以获得一些性能提升,那么请明确使用signed char
或unsigned char
。
答案 2 :(得分:1)
如果您的程序足够简单,优化器可以做正确的事情,而不必担心它。在这种情况下,普通int
将是最简单的(并且是前向证明的)解决方案。
但是,如果您真的想要结合特定的位宽和速度,可以使用C99标准中的 7.18.1.3最快最小宽度整数类型(需要符合C99标准的编译器)。 / p>
例如:
int_fast8_t x;
uint_fast8_t y;
是有符号和无符号类型,保证能够存储至少8位数据并使用通常更快的底层类型。当然,这一切都取决于你之后对数据做了什么。
例如,在我测试的所有系统上(参见:standard type sizes in C++),快速类型为8位长。
答案 3 :(得分:1)
来自ARM系统开发人员指南
"大多数ARM数据处理操作仅为32位。出于这个原因,你应该使用 尽可能为局部变量使用32位数据类型int或long。避免使用char和 简称为局部变量类型,即使您正在操作8位或16位值"
本书中的一个示例代码来证明这一点。请注意char的回绕处理,而不是unsigned int。
int checksum_v1(int *data)
{
char i;
int sum = 0;
for (i = 0; i < 64; i++)
{
sum += data[i];
}
return sum;
}
使用i作为char时的ARM7程序集
checksum_v1
MOV r2,r0 ; r2 = data
MOV r0,#0 ; sum = 0
MOV r1,#0 ; i = 0
checksum_v1_loop
LDR r3,[r2,r1,LSL #2] ; r3 = data[i]
ADD r1,r1,#1 ; r1 = i+1
AND r1,r1,#0xff ; i = (char)r1
CMP r1,#0x40 ; compare i, 64
ADD r0,r3,r0 ; sum += r3
BCC checksum_v1_loop ; if (i<64) loop
MOV pc,r14 ; return sum
当i是无符号整数时,ARM7程序集。
checksum_v2
MOV r2,r0 ; r2 = data
MOV r0,#0 ; sum = 0
MOV r1,#0 ; i = 0
checksum_v2_loop
LDR r3,[r2,r1,LSL #2] ; r3 = data[i]
ADD r1,r1,#1 ; r1++
CMP r1,#0x40 ; compare i, 64
ADD r0,r3,r0 ; sum += r3
BCC checksum_v2_loop ; if (i<64) goto loop
MOV pc,r14 ; return sum