如何在C中的堆栈中分配超过所需的内存?

Posted

技术标签:

【中文标题】如何在C中的堆栈中分配超过所需的内存?【英文标题】:How to allocate more than required memory in the stack in C? 【发布时间】:2021-08-20 18:15:00 【问题描述】:

例如。

int x;

x 分配了 4 字节的内存。我想要的是为x 分配超过 4 个字节,例如。 8. 对于整数,我可以很容易地使用long long int,但是结构呢?

struct Es 
    int a;
    int b;

我可以添加char useless[<Extra memory>],但我想指定在分配时要分配多少内存。例如。

struct Es es; //I want to specify how much to allocate here

我说的是实际分配,而不是堆栈对齐。

它必须是堆栈,并且必须在分配时指定。

【问题讨论】:

欢迎您!你能解释一下你的用例吗?为什么要这样做? “别问我将如何使用它。”,我们不得不这样做。这闻起来强烈是XY problem。如果您的程序内存管理不善,请使用 valgrind 之类的工具来找出位置。 我们之所以这么问,是因为这样的事情非常非正统,可能不可能,通常当有人问这样的事情时,是因为他们不知道其他方法更简单或更强大。 @Addison 在编译时。 我会说,如果有人被要求解释他们的推理或目标时感到恼火,或者求助于“我很聪明,只要相信”,他们可能不知道自己在做什么。我”。 【参考方案1】:

为结构过度分配内存的一种方法是使用 alignas 宏。这是一个例子:

 #include <stdalign.h>

 struct Foo  int l; ;

 void z(struct Foo );
 void y(int );

 void foo() 
    alignas (512) struct Foo f;
    int k = 20;
    z(f); 
    y(k);
 

您可以将该代码放入在线编译器并检查生成的 ASM 以确认 F 是否过度分配。

【讨论】:

为什么我需要在线编译器? 根据我的经验,验证某些假设是否成立(即分配了多少堆栈)是最简单的方法。当然,您不必这样做。 @dbush,是的,它可以用于各种目的。我看到的最常见的一种是将对象过度分配到 64 字节以防止错误共享。 等等,在哪一侧分配过度了?我的意思是,实际数据的哪一侧是过度分配的内存?我不太擅长组装来弄清楚这一点。但不是在数据之前吗?这不是我真正想要的,但没关系。如果例如怎么办。内存分配到511,那么alignas (512) struct Foo f;不会只是将内存从512分配到516吗?没有超额分配?我确定我错了,我希望你说错了。

以上是关于如何在C中的堆栈中分配超过所需的内存?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中清除堆栈中分配的内存

如何查找变量是在堆栈还是堆中分配?

如何在 C# 中释放在 C++ 中分配的内存

如何在清单中分配 android:sharedUserId?

如何在 C 中分配 32 字节对齐的内存

如何在 C 中分配和释放对齐的内存