【问题标题】:Optimization: Accessing pointers in different memory areas优化:访问不同内存区域的指针
【发布时间】:2018-09-24 08:41:37
【问题描述】:

假设有以下情况:

int** data = calloc(3, sizeof(int* ));

int* dynamicInt = calloc(1, sizeof(int));
int automaticInt = 0;
int stackint[1] = {0};

data[0] = dynamicInt;
data[1] = &automaticInt;
data[2] = stackint;

然后您将使用 *data[i] 来浏览值

在我看来,从堆跳转到栈甚至会比从堆跳转到堆中的另一个地址要慢。


分配这些指针的最快方法是什么? 真正有用的是,如果有人列举可能的变化(例如:stack-stack: 6(fastest)、heap-heap 5、auto-auto 4、heap-stack 3 等)

【问题讨论】:

  • 如果你有一台普通的电脑,内存就是内存。没有区别。
  • 如果它真的很重要,大多数现代汇编程序都有一个预取操作来在需要之前预加载地址。这可以减轻或消除缓存的第一个负载。

标签: c pointers memory optimization memory-management


【解决方案1】:

即使引用的地址因您不访问而被交换,也没有区别

【讨论】:

    【解决方案2】:

    我的意思是它都在 RAM 中,对吗?访问堆栈与堆并没有显着不同的性能恕我直言。您将受到性能影响的地方是您的空间缓存位置,因为您可能会在整个内存中跳跃并导致缓存未命中。如果您关心性能并且必须使用这样的方案,您可能会通过按值(即地址)对指针进行排序来获得一些好处。但是,如果您的指针没有太大变化,您仍然可能会受益于缓存中的时间局部性。不确定这是否有帮助,但这是我的两分钱。

    【讨论】:

    • 在这个简约的例子中,性能肯定是没有意义的,但是如果在诸如包含许多元素的双向链表中实现,当迭代整个列表时(这通常发生在 dll 中) ,我确信性能差异稍微不那么显着,因此希望通过 1232 和 181381238 等地址,有时在顶部带有 l2 的旧处理器上 :)
    • @JuanPabloJuliosEstebaFiores 唯一的性能差异与缓存未命中有关。但是当您使用动态分配的数据时,不能保证多个分配将在同一个缓存行中。除非您在不同的内存区域中有数千个项目并且您经常访问它们,否则效果将可以忽略不计。
    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多