我正在查看我编写的代码段的汇编,并注意到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进行最大优化编译。
答案 0 :(得分:4)
对数组索引使用size_t
类型。它足以容纳数组索引。通常它在64位平台上保持64位,在32位平台上保持32位。
答案 1 :(得分:3)
在您的案例中使用long long
通常不是一个好主意。下一个阅读代码的开发人员会认为代码需要处理大量数据,或者原始程序员不知道他在做什么。
最好使用size_t
,表示变量应该能够处理任何数组大小,或int
,表明它是具有正常范围要求的通用变量。
我应该选择什么整数类型?
int 用于普通整数变量。除非有理由选择其他类型,否则这是您应该使用的类型。 int
的大小已由平台开发人员选择,因为它的大小很合适(无论出于何种原因,但通常在范围,内存消耗和该平台上的性能之间进行良好的权衡)
char 用于字符串和二进制数据。如果您打算使用二元运算符(尤其是移位运算符),则应使用 unsigned char 。
size_t 用于数组/内存大小,数组索引等
根据需要使用其他int尺寸(短,长,长long ,固定尺寸)。固定大小通常用于在不同系统之间交换的数据。当标准函数的返回值具有相应的大小时,通常使用long / short。当你需要存储大数字时使用long long,但对于非常大的整数,你需要一个BigInt库。