Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中使用'int'还有理由吗+;密码?_C++ - Fatal编程技术网

C++ 在C+中使用'int'还有理由吗+;密码?

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位整数提升为

许多样式指南,例如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位整数提升为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++用户已经移动到 STD::SiZeSt,但是我不想使用无符号整数,除非我真的需要模<代码> 2 ^ n < /代码>行为。 在大多数情况下,使用
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--){...}