[英]When targeting 64-bit platforms in C, is it better to use 64-bit variables for array references?
我正在看我编写的代码片段的汇编,并注意到指示的movsxd
op仅在ret
变量为32位时出现。 如果ret
是64位,则直接使用: mov BYTE PTR [rdi+rbp+86], al
。
; 861 : _BitScanForward(&depth, subject);
movsx edx, dx
; 862 : qry_args->lo_refs[++ret] = (BYTE)depth;
inc ebp // ret is in ebp
bsf ecx, edx
movsxd rax, ebp // convert 32-bit ebp to 64-bit rax
; 865 : subject ^= (1 << depth);
; 866 : nulls_mask.lo |= (1 << depth);
movsx r9d, r9w
btc edx, ecx
bts r9d, ecx
mov BYTE PTR [rax+rbx+86], cl // 64-bit rax used by mov
由于mov
op需要在64位模式下使用64位寄存器,所以对我而言,理想的是,用于引用内存的任何变量(例如数组引用程序)都应理想地为64位。
但是,我知道在不超过2 ^^ 31次迭代的循环中简单地使用int
是很常见的。 实际上,我们是否应该将long long
( int64
)作为64位代码的最佳实践? 对此有何评论?
除了这里显示的内容之外,我还没有麻烦去进行测试。
附言 这不是一个微观优化问题。 这是形式问题。 对我来说,使用编译器使用的类型是有意义的。
信息:我正在使用VS 2016进行编译,并启用了最大优化功能。
将size_t
类型用于数组索引。 它足够大以容纳数组索引。 通常,它在64位平台上拥有64位,在32位平台上拥有32位。
在您的情况下long long
使用通常不是一个好主意。 下一个阅读您的代码的开发人员将认为该代码需要处理大量数字,或者原始程序员不知道他在做什么。
最好使用size_t
(表示变量应该能够处理任何数组大小),或者使用int
(表示它是具有正常范围要求的通用变量)。
我应该选择哪种整数类型?
int用于普通整数变量。 除非有理由选择其他类型,否则应使用此类型。 int
的大小已由平台开发人员选择,因为它是一个可以使用的大小(无论出于何种原因,但通常在该平台的范围,内存消耗和性能之间要进行权衡)
char用于字符串和二进制数据。 如果计划使用二进制运算符(尤其是shift运算符),则应使用unsigned char 。
size_t用于数组/内存大小,数组索引等。
根据需要使用其他int大小( short , long , long long ,固定大小)。 固定大小通常用于在不同系统之间交换的数据。 当标准函数的返回值具有相应的大小时,通常使用long / short。 需要存储大量数字时使用long long,但是对于很大的整数,则需要一个BigInt库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.