![]() |
1
2
由于这一点似乎完全混乱: 在过去,我们有16位CPU,比如8088、268等。 要制定地址,您必须加载分段寄存器(16位寄存器)和地址寄存器。如果访问数组,您可以将数组基加载到段寄存器中,地址寄存器将是索引。 这些平台的C编译器确实存在,但指针算法涉及检查地址是否溢出,并在必要时碰撞段寄存器(效率低下)。平面寻址指针在硬件中根本不可能实现。 快进到80386现在我们有一个完整的32位空间。硬件指针是可能的。索引+基址寻址会导致1个时钟周期的损失。不过,这些段也是32位的,因此即使您运行的是32位模式,也可以使用段加载数组,从而避免这种损失。368还将段寄存器的数量增加了2个。(不知道为什么英特尔认为这是个好主意)尽管如此,仍然有很多16位代码 如今,段寄存器在64位模式下被禁用,基址+索引寻址是免费的。 在硬件中,是否有任何平台可以让平面指针超越数组寻址?嗯,是的。1979年发布的摩托罗拉68000具有平坦的32位地址空间,没有分段,Base+Index寻址模式比立即寻址产生8个时钟周期的惩罚。因此,如果你正在为80年代初的Sun station、Apple Lisa等编程,这可能是相关的。 简而言之。如果你想要一个数组,就使用数组。如果你想要一个指针,就使用指针。不要试图聪明地使用你的编译器。将数组转换为指针的卷积代码极不可能提供任何好处,而且可能会更慢。 |
![]() |
2
1
不建议使用此代码:
因为1)你无缘无故地有两个不同的指针指向同一个地方,2)你不检查
总而言之,我建议使用这个:
|
![]() |
3
1
在您的示例中,如果没有编译器优化,指针算术可能更有效,因为只增加指针比在每次循环迭代中计算新的偏移量更容易。然而,大多数现代CPU的优化方式是,使用偏移量访问内存不会导致(显著)性能损失。 即使你碰巧在一个指针运算速度更快的平台上编程,那么如果你激活编译器优化(大多数编译器上的“-O3”),编译器很可能会使用任何最快的方法。 因此,是否使用指针算法主要取决于个人偏好。 使用数组索引而不是指针算法的代码通常更容易理解,也更不容易出错。 不使用指针算法的另一个优点是 pointer aliasing 可能不是问题(因为您使用的指针较少)。这样,编译器在优化代码方面可能会有更多的自由(使代码更快)。 |
![]() |
Community wiki · C中有哪些耗时的操作? 1 年前 |
![]() |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
![]() |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |