我的计算机有64位处理器,并且当我寻找sizeof(int),sizeof(long)以及sizeof(long long),事实证明,INT和长为32位,和长长为64位.我研究了原因,看来普遍的假设是说C++ 中的int符合机器的字大小是错误的.据我所知,编译器需要定义大小,我的是Mingw-w64.我研究的原因是理解如果小于字大小的类型的使用有利于速度(例如,短与int)或它是否具有负面影响.在32位系统中,一种流行的观点是:由于字大小为int,short将被转换为int,这将导致额外的位移等,从而导致更差的性能.反对意见是缓存级别会有好处(我没有深入研究),使用short会对虚拟内存经济有用.所以,除了这种困境之间的混淆之外,我还面临着另一个问题.我的系统是64位,如果我使用int或short并不重要,它仍然会小于字大小,我开始认为使用64位长的长度不是很有效,因为它是在系统设计的级别.另外我读到还有另一个约束,即OS的库(ILP64,LP64),它定义了类型大小.在ILP64中,与LP64相比,默认int为64位,如果我使用支持ILP64的操作系统,它会加速程序吗?一旦我开始询问我应该使用哪种类型来加速我的C++程序,我就面临更深层次的主题,其中我没有专业知识,而且一些解释似乎相互矛盾.你能解释一下:
1)如果最佳做法是在x64中使用long long来实现最高性能,即使对于1-4字节数据也是如此?
2)使用小于字大小的类型(内存胜利与附加操作)的权衡
3)word和int size是64位的x64计算机是否有可能通过使用所谓的向后兼容性使用16位字大小来处理短路?或者它必须将16位文件放入64位文件中,并且可以完成的事实将系统定义为向后兼容.
4)我们可以强制编译器使int 64位?
5)如何将ILP64整合到使用LP64的PC中?
6)使用适用于其他编译器,操作系统和体系结构(32位处理器)的上述问题的代码可能存在哪些问题?
我发现没有原生bool类型.人们要么使用int或者char- 虽然它似乎int比使用频率更高char?这是真的?
我的第一个冲动是使用,char因为它是一个较小的数据类型,但有一些我错过了?为int更好地为布尔值,如果是这样-为什么?
通常,我想大多数人会使用int所有内容,并且有时会unsigned int在需要时使用它们。short int有时您可能会使用,可能用于网络流量等。
但是最近我已经开始std::size_t用于索引STL容器(应该如此),然后我开始std::uint8_t在创建四个8位色值(RGBA)而不是a的结构时找到用处char,因为它可以对我来说更有意义(这是一个数字,不是字符类型,也不是8位值,它是0-255之间的8位数字)。
然后在进行一些网络编程时,我发现我想确保传递的某些值是16位。根据https://en.cppreference.com/w/cpp/language/types,我不能假设a short int是16位,而只能是至少 16位。所以我找到了一个用途std::int16_t。
这使我逐渐开始在所有地方使用固定宽度类型。这使我真正考虑了我需要什么,需要多少范围等,不管它是否会变成负值。
所以现在,int我的代码中几乎没有零发生。
我认为这有三个原因:
但是我担心这会降低性能,因为您通常的消费级CPU会以std::int32_t更好的本机宽度类型运行。
那么,什么时候应该使用固定宽度类型,它们如何影响性能?
很多类似问题的回答都指出,标准是这样的。但是,我无法理解标准制定者做出这一决定背后的原因。
根据我的理解, anunsigned char不会以 2 的补码形式存储值。所以,我没有看到让我们说XOR ing twounsigned chars会产生意外行为的情况。因此,将它们提升到int似乎只是浪费空间(在大多数情况下)和 CPU 周期。
此外,为什么int?如果一个变量被声明为unsigned,显然无符号对程序员很重要,因此在我看来,升级到 anunsigned int仍然比 an 更有意义int。
[编辑 #1] 如评论中所述,unsigned int如果int无法充分容纳unsigned char.
[编辑#2] 为了澄清这个问题,如果它是关于在intthan上运行的性能优势char,那么为什么它在标准中?这可以作为向编译器设计者提供更好优化的建议。现在,如果有人要设计一个不这样做的编译器,这将使他们的编译器不完全遵守 C/C++ 标准,即使假设该编译器确实支持该语言的所有其他必需功能。简而言之,我无法弄清楚为什么我不能直接操作的原因unsigned chars,因此将它们提升到 的要求ints似乎没有必要。你能举个例子证明这是错误的吗?
在msgpcc(GSP for MSP430微控制器)手册中,作者写道:
如果要在函数中使用小整数,请使用int而不是char或unsigned char.生成的代码将更有效,并且在大多数情况下,实际上不会浪费存储.
为什么int效率更高?
UPD.为什么(u)int_fast8_t在mspgcc中定义(unsigned) char,而不是(unsigned) int.据我所知,(u)int_fast*_t应该定义为具有足够大小的最有效类型.
你好.假设您有32位处理器.8位char和16位short int类型比原生32位慢int吗?那么使用64位long long int呢?
默认情况下硬件是否支持此数据类型,或者通过使用其他指令将它们全部转换为32位数据?
如果我必须存储少量的字符,将它们存储为整数是不是更快?
今天,我注意到,有几个简单的按位和算术运算的速度之间显著不同int,unsigned,long long和unsigned long long我的64位PC.
特别是,下面的循环是两次快速的unsigned为long long,这是我没有想到的.
int k = 15;
int N = 30;
int mask = (1 << k) - 1;
while (!(mask & 1 << N)) {
int lo = mask & ~(mask - 1);
int lz = (mask + lo) & ~mask;
mask |= lz;
mask &= ~(lz - 1);
mask |= (lz / lo / 2) - 1;
}
Run Code Online (Sandbox Code Playgroud)
(完整代码在这里)
下面是定时(以秒计)(为g++ …
所以我只是想用连续数字0-255来填充缓冲区.我对此并没有多想,最终陷入无限循环.
uint8_t i;
uint8_t txbuf[256];
for (i=0; i<256; i++) {
txbuf[i] = i;
}
Run Code Online (Sandbox Code Playgroud)
问题是i永远不会是256,因为它在255之后翻了个零.
我的问题是,有没有办法在没有碰到i16位值的情况下执行此循环?
注意:我知道我可以将循环更改i<255为最后一个位置添加另一行,但我试图找出一个更好看的方式.
我在某处读到 int 数据类型提供更好的性能(与 long 和 short 相比),无论操作系统如何,因为它的大小根据操作系统的字大小进行修改。其中 long 和 short 占用 4 和 2 个字节,这可能与 OS 的字大小匹配,也可能不匹配。任何人都可以对此做出很好的解释吗?
我正在自动生成C代码来计算大型表达式,并试图用简单的例子弄清楚在单独的变量中预定义某些子部分是否有意义.
举个简单的例子,假设我们计算了一些形式:
#include <cmath>
double test(double x, double y) {
const double c[9][9] = { ... }; // constants properly initialized, irrelevant
double expr = c[0][0]*x*y
+ c[1][0]*pow(x,2)*y + ... + c[8][0]*pow(x,9)*y
+ c[1][1]*pow(x,2)*pow(y,2) + ... + c[8][1]*pow(x,9)*pow(y,2)
+ ...
Run Code Online (Sandbox Code Playgroud)
所有c [i] [j]正确初始化.实际上,这些表达式包含数以千万计的乘法和加法.
现在提出一个同事 - 减少对pow()的调用次数并缓存表达式中经常需要的值 - 在单独的变量中定义x和y的每个幂,这没什么大不了的,因为代码是自动的无论如何生成,像这样:
double xp2 = pow(x,2);
double xp3 = pow(x,3);
double xp4 = pow(x,4);
// ...
// same for pow(y,n)
Run Code Online (Sandbox Code Playgroud)
但是,我认为这是不必要的,因为编译器应该处理这些优化.
不幸的是,我没有阅读和解释汇编的经验,但我想我看到所有对pow()的调用都被优化了,这是对的吗?此外,编译器是否缓存pow(x,2),pow(x,3)等的值?
提前感谢您的意见!
整数可以是8个字节,即2 ^ 64.很多价值观.
假设我想编写一个小程序,将这样的值存储在一个文件中:
3 1 5 6 2 8 9 0 1 2 ....
在任何时候我的值都不会高于9.所以我只需要10个组合,我可以通过仅采用2 ^ 4(16种组合)的数据类型获得.不是2 ^ 64.
不会更有效率......我怎么能做到这一点.C++是否具有本机单数字类型.
我的C程序在内存中存储许多整数值,并读取它们并经常对其进行比较。类型的范围unsigned char是足够的,但是我使用它int是因为速度对我来说比内存消耗重要得多,而且我认为CPU的工作int速度可能更快。但这只是直觉的粗略猜测,我不确定。