C++ 在C+中使用'int'还有理由吗+;密码?
许多样式指南,例如GoogleOne,建议在索引数组时使用C++ 在C+中使用'int'还有理由吗+;密码?,c++,C++,许多样式指南,例如GoogleOne,建议在索引数组时使用int作为默认整数。随着64位平台的兴起,大多数情况下,int仅为32位,这不是平台的自然宽度。因此,除了简单的选择外,我认为没有理由保留这种选择。我们清楚地看到,在编译以下代码时: double get(const double* p, int k) { return p[k]; } 它被编译成 movslq %esi, %rsi vmovsd (%rdi,%rsi,8), %xmm0 ret 其中,第一条指令将32位整数提升为
int
作为默认整数。随着64位平台的兴起,大多数情况下,int
仅为32位,这不是平台的自然宽度。因此,除了简单的选择外,我认为没有理由保留这种选择。我们清楚地看到,在编译以下代码时:
double get(const double* p, int k) {
return p[k];
}
它被编译成
movslq %esi, %rsi
vmovsd (%rdi,%rsi,8), %xmm0
ret
其中,第一条指令将32位整数提升为64位整数
如果代码转换为
double get(const double* p, std::ptrdiff_t k) {
return p[k];
}
生成的程序集现在是
vmovsd (%rdi,%rsi,8), %xmm0
ret
这清楚地表明,使用
std::ptrdiff_t
比使用int
更能让CPU感到宾至如归。许多C++用户已经移动到int
不会影响性能,因为未定义的行为或有符号整数溢出允许编译器在处理索引的循环中将任何int
在内部提升为std::ptrdiff_t
,但从上面我们可以清楚地看到,编译器对int
并不感到自在。此外,在64位平台上使用std::ptrdiff_t
将减少溢出的可能性,因为我看到越来越多的人在处理大于2^31-1的整数时被int
溢出困住,而这些整数如今变得非常普遍
从我所看到的,唯一让int
与众不同的是5
这样的文字是int
,但是如果我们将std::ptrdiff\u t
作为默认整数,我看不出它会在哪里引起任何问题
我即将把std::ptrdiff_t
作为我的小公司编写的所有代码的事实上的标准整数。这是一个糟糕的选择,有什么原因吗
PS:我同意这样一个事实,即名称std::ptrdiff\u t
很难看,这就是我将其键入il::int\u t
的原因,后者看起来更好一些
PS:我知道很多人会建议我使用std::size\t
作为默认整数,我真的想明确我不想使用无符号整数作为默认整数。Bjarne Stroustrup和标准委员会在42:38和1:02:50的视频中承认,在STL中使用std::size\u t
作为默认整数是一个错误
PS:就性能而言,在我所知的任何64位平台上,+
,-
和*
对int
和std::ptrdiff\u t
的编译方式相同。所以速度没有差别。如果除以编译时常数,则速度相同。只有在您对b
一无所知的情况下对a/b
进行除法时,在64位平台上使用32位整数才能在性能上稍有优势。但这种情况非常罕见,因为我不认为这是从std::ptrdiff\u t
转移的选择。当我们处理矢量化代码时,这里有一个明显的区别,越小越好,但情况不同,没有理由坚持使用int
。在这种情况下,我建议使用固定大小的C++类型。大多数程序不会在几个CPU周期的边缘上生存和死亡,而 INT/COD>很容易编写。但是,如果您对性能敏感,我建议使用
中定义的固定宽度整数类型,例如int32\u t
或uint64\u t
。
这样做的好处是可以非常清楚地了解它们在有符号或无符号方面的预期行为,以及它们在内存中的大小。该头还包括快速变体,如IntFasx3Lt*,至少是所述大小,但如果有助于性能,则可能更多。 < P> >讨论了C++核心指南:
赫伯·萨特写道将添加gsl::index
(将来可能std::index
),定义为ptrdiff\u t
hsutter于2017年12月26日发表评论•
(感谢许多WG21专家对此提出的意见和反馈。)
注。)
将以下typedef添加到GSL
namespace gsl{using index=ptrdiff\u t;}
并为所有容器索引/下标/大小推荐gsl::index
基本原理
指南建议对下标/索引使用有符号类型。
见ES.100至ES.107。C++已经使用了符号整数数组。
下标
我们希望能够教人们编写“新的干净的现代代码”
这是简单、自然、无警告的高警告级别
不会让我们写一个关于简单代码的“陷阱”脚注
如果我们没有像index
这样的可采用的短词,那么这就是竞争
有了int
和auto
,人们仍然会使用int
和auto
并获得他们的
漏洞。例如,他们将为(int i=0;i编写,没有正式的理由使用int
。根据标准,它与任何正常的东西都不对应。对于索引,您几乎总是需要有符号指针大小的整数
这就是说,键入int
感觉就像你刚刚对里奇说了声嗨,键入std::ptrdiff_t
感觉就像斯特劳斯特鲁普踢了你的屁股。程序员也是人,不会给他们的生活带来太多丑陋。我更喜欢使用long
或一些容易键入的typedef,比如index
,而不是std::ptrdiff_t
我认为使用int
没有真正的原因
for(size_t i = N-1; i < N; i--){...}
for(int i = N-1; i >= 0; i--){...}