- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我的电脑有 64 位处理器,当我寻找 sizeof(int)
时, sizeof(long)
, 和 sizeof(long long)
,原来是 国际和 长是 32 位,和 长长是 64 位。我研究了原因,似乎流行的假设告诉 国际在 C++ 中适合机器的字大小是错误的。据我了解,由编译器来定义大小,我的是 Mingw-w64。我研究的原因是了解如果使用小于字大小的类型有利于速度(例如, short vs int )或者是否有负面影响。在 32 位系统中,一种流行的观点是:由于字长为 。国际 , 短将转换为 国际它会导致额外的位移等,从而导致性能下降。反对意见是缓存级别会有好处(我没有深入研究),使用短对虚拟内存经济很有用。所以,除了这种两难的困惑之外,我还面临着另一个问题。我的系统是64位的,用也没关系国际或 短 ,它仍然会小于字的大小,我开始想使用 64 位会不会很有效 长长因为它处于系统设计的级别。我还读到还有另一个约束,它是定义类型大小的操作系统的库(ILP64,LP64)。在 ILP64 中默认 国际与 LP64 相比是 64 位,如果我使用支持 ILP64 的操作系统,它会加速程序吗?一旦我开始问我应该使用哪种类型来加速我的 C++ 程序,我面临更深层次的主题,我没有专业知识,有些解释似乎相互矛盾。你能解释一下吗:
1) 如果最好使用 长长在 x64 中即使对于 1-4 字节数据也能实现最高性能?
2)权衡使用小于字大小的类型(内存获胜与附加操作)
3) 字和整数大小为 64 位的 x64 计算机是否有可能通过使用所谓的向后兼容性来处理短的、使用 16 位字的大小?或者它必须将 16 位文件转换为 64 位文件,并且可以做到这一点的事实将系统定义为向后兼容。
4) 我们可以强制编译器生成吗?国际 64位?
5) 如何将 ILP64 集成到使用 LP64 的 PC 中?
6) 使用适用于其他编译器、操作系统和架构(32 位处理器)的上述问题的代码可能会出现哪些问题?
最佳答案
1) 如果在 x64 中使用 long long 来实现最高性能是最佳实践,即使对于 1-4 字节数据也是如此?
不 - 它实际上可能会使您的表现更糟。例如,如果您使用 64 位整数,而您可以使用 32 位整数,那么您只是将必须在处理器和内存之间发送的数据量增加了一倍,而内存要慢几个数量级。您所有的缓存和内存总线都会以两倍的速度崩溃。
2)权衡使用小于字大小的类型(内存获胜与附加操作)
通常,现代机器性能的主要驱动因素是需要存储多少数据才能运行程序。一旦程序的工作集大小超过寄存器、L1 缓存、L2 缓存、L3 缓存和 RAM 的容量,您将看到显着的性能悬崖。
此外,如果您的编译器足够聪明,可以弄清楚如何使用处理器的 vector 指令(又名 SSE 指令),那么使用较小的数据类型可能会是一个胜利。现代 vector 处理单元足够智能,可以将 8 个 16 位短整数与两个 64 位长整数填充到相同的空间中,因此您可以一次执行四倍的运算。
3) 字和整数大小为 64 位的 x64 计算机是否有可能通过使用所谓的向后兼容性来处理短的、使用 16 位字的大小?或者它必须将 16 位文件转换为 64 位文件,并且可以做到这一点的事实将系统定义为向后兼容。
我不确定你在这里问什么。一般来说,64 位机器能够执行 32 位和 16 位可执行文件,因为这些早期的可执行文件使用了 64 位机器潜力的子集。
硬件指令集通常向后兼容,这意味着处理器设计人员倾向于添加功能,但很少删除功能。
4)我们可以强制编译器使 int 成为 64 位吗?
所有编译器都有相当标准的扩展,允许您使用固定位大小的数据。例如头文件stdint.h
声明类型,例如 int64_t
, uint64_t
, 等等。
5) 如何将 ILP64 集成到使用 LP64 的 PC 中?
https://software.intel.com/en-us/node/528682
6) 使用适用于其他编译器、操作系统和架构(32 位处理器)的上述问题的代码可能会出现哪些问题?
通常,编译器和系统足够聪明,可以弄清楚如何在任何给定系统上执行您的代码。但是,32 位处理器将不得不做额外的工作来处理 64 位数据。换句话说,正确性不应该是问题,但性能会是问题。
但通常情况下,如果性能对您来说真的很重要,那么无论如何您都需要针对特定的体系结构和平台进行编程。
澄清请求:非常感谢!我想澄清问题:1。你说它对内存力不好。让我们以 32 位 int 为例。当你将它发送到内存时,因为它是64位系统,对于一个想要的整数0xee ee ee ee,当我们发送它时它会不会变成0x ee ee ee ee+其他32位?当字长为 64 位时,处理器如何发送 32 位? 32 位是所需的值,但它不会与 32 位未使用的位组合并以这种方式发送吗?如果我的假设是真的,那么内存没有区别。
这里有两件事要讨论。
首先,你讨论的情况没有发生。处理器不需要将 32 位值“提升”为 64 位值才能正确使用它。这是因为现代处理器具有不同的访问模式,能够适本地处理不同大小的数据。
例如,64 位 Intel 处理器有一个名为 RAX 的 64 位寄存器。但是,通过将其称为 EAX,这个相同的寄存器可以在 32 位模式下使用,甚至可以在 16 位和 8 位模式下使用。我从这里偷了一张图:
x86_64 registers rax/eax/ax/al overwriting full register contents
1122334455667788
================ rax (64 bits)
======== eax (32 bits)
==== ax (16 bits)
== ah (8 bits)
== al (8 bits)
关于64 位机器中的 C++ int 与 long long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39779880/
我找到了long int long和 int long long可以编译为变量类型。 long int long有什么区别吗, int long long , long long和 long long
我无法找出为什么“加密”函数仍然将“消息”读取为字符串,尽管我已经使用不同的方法将数据类型更改为字节。 错误消息是“Prince 类型中的方法 Encrypt(long, long, long, lo
这个问题在这里已经有了答案: Is "long long" = "long long int" = "long int long" = "int long long"? (4 个答案) 关闭 6 年
我正在从 Java 过渡到 C++,并且对 long 数据类型有一些疑问。在 Java 中,要保存大于 232 的整数,您只需编写 long x;。但是,在 C++ 中,long 似乎既是数据类型又是
clang-tidy 12.0.1 报告了一个相当奇怪的警告。在以下代码中: #include int main() { std::vector v1; const auto a =
我创建了一个 pair 和 long long int 的映射 - map,long long int >; 和一个交互器 - map, long long int >::iterator it1;
我想知道 unsigned long long 和 unsigned long long int 的主要区别。它们可以互换使用吗? 对于像 9223372036854775807 这样的大十进制数的计
我看到的大多数代码都使用缩写类型来声明变量,例如 long long x; // long long int x short y; // short int y 我浏览了 C++11 标准(第 3.9
common_type::type是 unsigned long因为关于积分提升后的操作数,标准说... [...] if the operand that has unsigned integer
long long int A = 3289168178315264; long long int B = 1470960727228416; double D = sqrt(5); long lon
这些新数据类型的目的是什么?我通常只使用“int”或“long”,但为什么会存在这些呢?它们带来了什么新功能或用途? 最佳答案 long int一直是long的全称,只是很少用而已。 long lon
我正在运行以下for循环 for(unsigned long long int i = N-1; i >= 0; i--){ cin>>L[i]; } 当程序到达这个代码段时,它停止响应。但是
最近问了一个关于递归导致这个问题的问题 注意-> count() 函数返回键 K 在 map 容器中出现的次数。如果键存在于容器中,则返回 1,因为映射仅包含唯一键。如果 map 容器中不存在键,则返
好的,所以我正在尝试实现客户端 - 服务器程序(套接字编程)。 我的客户发送一个嵌入字符串中的 long long int,如下所示: char copy[10]; sprintf(send_data
如果我有任务 Long c = a + b; 有没有一种简单的方法来检查 a + b 不大于/小于 Long.MAX_VALUE/Long.MIN_VALUE? 最佳答案 使用 Guava , 就这么
我需要制作一个 Comparator 来根据它的 long 类型的变量之一对我的对象列表进行排序。 public class ParticipantIndexComparator implements
假设我有这两种类型: typedef unsigned long long uint64; typedef signed long long sint64; 我有这些变量: uint64 a = ..
long long 和 long 有什么区别?而且它们都不适用于 12 位数字 (600851475143),我是不是忘记了什么? #include using namespace std; int
当结果将大于 C 中的 long long int 时,是否有可能对两个不同的 long long int 变量求和? 最佳答案 由于 OP 想要“在屏幕上打印结果”,因此将数字分成两部分:Most-
实际上我必须找到从源顶点到所有其他顶点的最短路径。为此,我获得了下面给出的代码模板。我想实现“Bellman–Ford algorithm”。 #include #include #include
我是一名优秀的程序员,十分优秀!