在C中以64位平台为目标时,使用64位变量进行数组引用会更好吗?

时间:2016-10-03 11:19:10

标签: c memory assembly long-integer

我正在查看我编写的代码段的汇编,并注意到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 longint64)作为64位代码的最佳实践吗?对此有何评论?

除了这里显示的内容之外,我还没有遇到测试这个问题的麻烦。

聚苯乙烯。这不是一个微优化问题。这是一个形式问题。对我来说,使用编译器使用的类型是有意义的。

信息:我正在使用VS 2016进行最大优化编译。

2 个答案:

答案 0 :(得分:4)

对数组索引使用size_t类型。它足以容纳数组索引。通常它在64位平台上保持64位,在32位平台上保持32位。

请参阅https://stackoverflow.com/a/2550799/909655

答案 1 :(得分:3)

在您的案例中使用long long通常不是一个好主意。下一个阅读代码的开发人员会认为代码需要处理大量数据,或者原始程序员不知道他在做什么。

最好使用size_t,表示变量应该能够处理任何数组大小,或int,表明它是具有正常范围要求的通用变量。

我应该选择什么整数类型?

int 用于普通整数变量。除非有理由选择其他类型,否则这是您应该使用的类型。 int的大小已由平台开发人员选择,因为它的大小很合适(无论出于何种原因,但通常在范围,内存消耗和该平台上的性能之间进行良好的权衡)

char 用于字符串和二进制数据。如果您打算使用二元运算符(尤其是移位运算符),则应使用 unsigned char

size_t 用于数组/内存大小,数组索引等

根据需要使用其他int尺寸(长long ,固定尺寸)。固定大小通常用于在不同系统之间交换的数据。当标准函数的返回值具有相应的大小时,通常使用long / short。当你需要存储大数字时使用long long,但对于非常大的整数,你需要一个BigInt库。