(嵌入式)C 中的静态变量,头文件的实例化和内存消耗?

问题描述 投票:0回答:1

我有一个带有

static int c[100];
的头文件 foo.h。如果我在 main.c 中包含 foo.h,它会创建 c[100] 的另一个实例。如果我在 bar.h 中再次这样做,我会得到另一个实例:

foo.h:

#ifndef FOO_H
#define FOO_H

static int c[100];
void foo(void);

#endif

foo.c

#include <stdio.h>
#include "foo.h"

void foo(void)
{
    c[0] = 100;
    printf("c: %d \taddress: %p \t size: %lu\n", c[0], (void *)&c, sizeof(c));
}

bar.h

#ifndef BAR_H
#define BAR_H

void bar(void);

#endif

bar.c

#include <stdio.h>
#include "bar.h"
#include "foo.h"

void bar(void)
{
    c[0] = 111;
    printf("c: %d \taddress: %p \t size: %lu\n", c[0], (void *)&c, sizeof(c));
}

main.c

#include <stdio.h>
#include <unistd.h>
#include "foo.h"
#include "bar.h"

int main()
{
    c[0] = 22;
    printf("c: %d \taddress: %p \t size: %lu\n", c[0], (void *)&c, sizeof(c));

    foo();

    bar();

    return 0;
}

结果显示我在不同地址的内存中有三个块,每个块有 400 字节:

c: 22   address: 0x102de4000     size: 400
c: 100  address: 0x102de4190     size: 400
c: 111  address: 0x102de4320     size: 400

所以它使用 1200 字节内存,对吗?

除此之外,这只是一个示例,其中数组可能会更大(因此我将使用带有运行时内存分配的指针):

  • 编译时有没有进行优化?
  • 编译器(我现在使用 gcc)是否足够聪明,能够意识到只使用了 c[0] ?
  • 操作系统(请说出一个)是否足够智能,不会浪费内存?
  • 当我为嵌入式微控制器编写代码时,在另一个操作系统上运行该程序(内存方面)有什么区别吗?
c memory static embedded
1个回答
0
投票

如果您只想要一个数组,请不要在头文件中define它。

extern
在标头中声明,并在
foo.c
文件中定义它。此外,使其
static
确保每个翻译单元获得数组的唯一实例。

foo.h

#ifndef FOO_H
#define FOO_H

extern int c[100];  // note the extern declaration
void foo(void);

#endif
#include "foo.h"
#include <stdio.h>

int c[100];        // here's the definition

void foo(void)
{
    c[0] = 100;
    printf("c: %d \taddress: %p \t size: %lu\n", c[0], (void *)&c, sizeof(c));
}

这样,所有包含

foo.h
的翻译单元都将在
c
中定义
foo.c
,因此它们只会共享一个数组。

© www.soinside.com 2019 - 2024. All rights reserved.