C++ 使用int而不是size\t索引访问向量元素会降低性能吗?

C++ 使用int而不是size\t索引访问向量元素会降低性能吗?,c++,vector,int,size-t,C++,Vector,Int,Size T,如果我使用int索引访问向量元素,它会将整数转换为size\t,然后调用操作符[](size\t)函数吗?是否有任何性能降低?这取决于-大小\u t取决于平台 另请参见:int和size\u t之间的主要区别在于int是有符号的,而size\u t是无符号的。此外,这两种类型可能具有不同的大小,因为这两种类型都是特定于平台且相互独立的 当两个大小相同时,从int到size\u t的转换是不可操作的,因此没有性能影响 当大小不同时,编译器足够聪明,可以将int索引的部分或扩展值传递到运算符[]中,

如果我使用
int
索引访问向量元素,它会将整数转换为
size\t
,然后调用
操作符[](size\t)
函数吗?是否有任何性能降低?

这取决于-
大小\u t
取决于平台


另请参见:

int和
size\u t
之间的主要区别在于
int
是有符号的,而
size\u t
是无符号的。此外,这两种类型可能具有不同的大小,因为这两种类型都是特定于平台且相互独立的

当两个大小相同时,从
int
size\u t
的转换是不可操作的,因此没有性能影响

当大小不同时,编译器足够聪明,可以将
int
索引的部分或扩展值传递到
运算符[]
中,几乎不需要任何开销,因为缩小大小需要部分加载,而扩展大小需要为上部加载零。但是,请注意,为扩展值的上半部分写入零不是额外的操作,因为它取代了从
size\t
类型的索引复制上半部分


因此,答案是否定的,你看不到任何性能差异。

Profile and see for your:)你可以测量并找出。你认为性能降低的原因是什么?你可以自己比较。当然,它会转换它,
v[0]
使用
int
,这显然是可行的。在编译器允许
int
为负值的情况下,在x86_64上选择
int
size\u t
相比,存在显著的本地性能成本(因为符号扩展相对昂贵)。显著的局部性能差异可能是或可能不是可检测到的全局性能差异。编译器何时检测到特定的
int
不能为负值?以我的经验(查看生成的代码)有时,但比人类明显看到的情况要少。@erip,你在问什么?int类型的大小也取决于平台。这个答案是误导性的。@mabraham-误导性的方式?@LeonardoHerrera这个问题指的是int和size_t。标准允许两者的大小由实现决定,因此决定使用其中任何一个来索引向量的后果取决于实现。答案只承认大小取决于平台。我不知道为什么我今天的阅读中突然出现了这个问题,但它把我送进了兔子洞。我仍然认为这个答案没有误导,它回答了这个问题“使用
int
访问向量元素是否会造成性能损失?”答案仍然是“视情况而定”",假设
size\u t
依赖于平台,不能保证为无符号整数!我的分析结果与您的分析相矛盾。这不是最新的编译器,因此可能改进了一些未定义行为的优化以修复此效果。缺少这一点,编译器在许多情况下允许负
int
,因此,它是符号扩展而不是零扩展,在x86_64中,符号扩展的效率可能比零扩展低得多。@JSF请分享您的基准测试。像这一个这样微小的差异很难进行基准测试,因为时间主要取决于对向量的实际访问,这取决于硬件缓存的性能。对不起,所有iling是属于我的雇主的代码。我不能共享任何源代码,因此基准测试结果将毫无意义。几乎所有我的基准测试结果都与您预期的一样,主要是目标数据上的缓存未命中,因此生成的代码中广泛的asm代码差异都没有任何影响。只需将所有这些代码放在一边,然后king仅在生成的代码很重要的情况下,我发现符号扩展操作很重要。根据分析结果,我们使用
unsigned
作为索引的数据类型,而不是
int
size\u t
。我们的代码比编译器可以安全地决定零扩展的典型代码的情况少得多一个
int
。我们的代码中没有包含超过
2**31
元素的容器。(超过
2**32
字节是常见的,但超过
2**31
元素是可能的)。在一些模糊的情况下,使用
无符号
作为索引需要进行调整,以避免比
大小
慢。但在更多的情况下,
无符号
稍微快一点,并且这些情况加起来会更快。