如何在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中的堆栈中分配超过所需的内存?的主要内容,如果未能解决你的问题,请参考以下文章