【问题标题】:calculate the memory space allocated by a structure in C计算C中结构分配的内存空间
【发布时间】:2013-04-21 13:13:41
【问题描述】:

我想知道是否有办法计算某个函数调用或某个程序前后的内存空间...之类的时间戳来计算执行时间...

我问这个是因为我想测试我的代码在内存空间方面的性能,因为我使用的是 tree 数据结构......我需要在辩护中展示我的项目在某些方面的性能方面...

我用的是窗户

【问题讨论】:

  • freemalloc 等的包装器是否跟踪分配?
  • 你试过使用 valgrind 吗?
  • 什么操作系统?我认为您的问题的答案将是特定于操作系统的

标签: c memory trie


【解决方案1】:

要找出名为foo 的结构使用的字节,您可以使用sizeof(struct foo)

POSIX.1 说您可以致电getrusage() 以了解您正在使用多少内存。

许多 C 实现将允许您调用 sbrk(0) 来获取当前的“内存顶部”地址。

在 Windows 上,您可以使用GetProcessMemoryInfo()

其他平台可能有与这些类似的其他调用,但如果所有其他方法都失败了,您可以将 malloc()free() 包装为跟踪您有兴趣跟踪的数据使用情况的版本。

【讨论】:

  • 我的理解是,如果我在我的函数之前使用 GetProcessMemoryInfo(),然后在我的函数执行之后,那么我会知道我的函数使用了多少内存?
  • 如果我写了 memory=sizeof(t);内存将有 12,因为值 t 的类型为 struct typedef struct { int size; int num_nodes; // trie 中的节点数 trie_node *root; } 尝试;并且 t 内的大小将具有值 4578 这是 int trie_create(trie *t) { memset(t, '\0', sizeof(trie));返回 trie_SUCCESS; }
  • 可能有十二个;在 32 位平台上可能会,但在 64 位平台上不会。在您的 trie_create() 函数的计数器中使用 sizeof() 虽然是可移植的,并且可能是您想要的。
【解决方案2】:

它可能是特定于平台/编译器的。在 unix/Linux/etc 中,可以使用sbrk(0) 来查找内存的end

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
    char *start, *data, *end;
    start = sbrk(0);
    printf("%p\n", start);
    data = malloc(243);
    end = sbrk(0);
    printf("%p\n", end);
    printf("diff: %ld", (long)(end - start));
    return 0;
}

输出(Cygwin):

0x80020000
0x80050000
diff: 196608

【讨论】:

    猜你喜欢
    • 2015-12-12
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多