C++ 整数和寄存器大小之间有关系吗?

C++ 整数和寄存器大小之间有关系吗?,c++,memory,integer,cpu,cpu-registers,C++,Memory,Integer,Cpu,Cpu Registers,最近,我在最近的一次采访中遇到了一个字符串操作问题,要求我优化性能。我必须使用迭代器在TCHAR字符之间来回移动(每个字符支持2字节的UNICODE) 没有真正考虑数组长度,我犯了一个奇怪的错误,没有使用size\u t而是使用int进行迭代。我知道它不兼容,也不安全 int i, size = _tcslen(str); for(i=0; i<size; i++){ // code here } inti,size=\u tcslen(str); 对于(i=0;iAFAI

最近,我在最近的一次采访中遇到了一个字符串操作问题,要求我优化性能。我必须使用迭代器在TCHAR字符之间来回移动(每个字符支持2字节的UNICODE)

没有真正考虑数组长度,我犯了一个奇怪的错误,没有使用size\u t而是使用int进行迭代。我知道它不兼容,也不安全

int i, size = _tcslen(str);    
for(i=0; i<size; i++){
   // code here
}
inti,size=\u tcslen(str);

对于(i=0;iAFAIK),寄存器大小和int的大小之间没有直接联系

但是,由于您知道编译应用程序的平台,因此可以使用所需的大小定义自己的类型别名:

范例

#ifdef WIN32 // Types for Win32 target
#define Int16 short
#define Int32 int
// .. etc.
#elif defined // for another target

然后,使用声明的别名。

严格按照标准,无法保证int的大小,更不用说与寄存器大小的关系了。此外,一些体系结构具有不同大小的寄存器(即:并非CPU上的所有寄存器都是相同大小的),并且不总是使用一个寄存器访问内存(与DOS及其段类似:偏移寻址)。
尽管如此,在大多数情况下,int与“常规”寄存器的大小相同,因为它应该是最常用的基本类型,而这正是CPU优化操作的基础。

如果我理解正确,我并不完全清楚,因为存在一些不同的问题(内存大小、分配、寄存器大小、性能?)这里的情况很复杂

我能说的是(仅以标题为准),即在大多数实际处理器上,为了获得最大速度,您应该使用与寄存器大小匹配的整数。原因是,当使用较小的整数时,您的优势是需要较少的内存,但例如在x86体系结构上,需要额外的转换命令。在Intel上,您也有问题,即访问未对齐的(主要是在寄存器大小的边界上)内存会带来一些惩罚。当然,在今天的处理器上,事情更加复杂,因为CPU能够并行处理命令。因此,您最终会对某些体系结构进行微调


因此,最好的猜测是不知道架构,即使用登记大小的INT,只要你能负担得起内存。

< P> C++标准没有指定int的大小(它说<代码> siZeof(char)=1</Cuth>,和<代码> sichof(char)。

我没有标准的拷贝,但是我的C编程语言的旧拷贝(第2.2节)<代码> int >代码>是指“一个整数,通常反映主机上的整数的自然大小。”我的C++编程语言的副本说(第4.6节)。“应该选择

int
类型最适合在给定计算机上保存和操作整数。”


你不是唯一一个说“我承认”的人。

有各种不同大小的寄存器。重要的是地址寄存器,而不是通用寄存器。如果机器是64位的,那么地址寄存器(或它们的一些组合)必须是64位,即使通用寄存器是32位。在这种情况下,编译器可能需要做一些额外的工作,才能使用多个通用寄存器实际计算64位地址


如果你不认为硬件制造商曾经为他们的寄存器做出过奇怪的设计选择,那么你可能永远都不需要处理原始的8086“"寻址。

读起来更像是一篇博客文章,而不是一个问题。很抱歉,我必须提供更多信息才能得到回复。简单地询问整数/寄存器大小并没有同样的意义。burcu-你能解释一下,使用int是如何不安全的。你的意思是它可能导致溢出吗?不,询问int之间是否存在关系eger和寄存器大小将是一个非常清楚的问题。通过将其隐藏在背景中,我实际上必须阅读两遍,以确保这确实是您所问的问题。Vivek,是的,我指的是溢出。我试图编辑它一点,但仍然很长。谢谢,这回答了我对性能的关注,并且显示如果平台选择是稳定的,那么使用整数并不是那么愚蠢。int是寄存器的大小在16位和32位平台上通常是正确的,但是所有64位平台(我知道)都有int为32位,长度为64位。(并且他们有64位寄存器)。但是这些64位体系结构通常仍然具有所有32位指令,因此不会降低性能。在“纯”64位体系结构上,int可能是64位的。也许吧。不过,这一点很好。