gpt4 book ai didi

c - 声明足够大的数组来容纳一个类型

转载 作者:行者123 更新时间:2023-12-02 06:38:53 24 4
gpt4 key购买 nike

假设我得到一个具有以下签名的函数:

void SendBytesAsync(unsigned char* data, T length)

我需要一个足够大的缓冲区来容纳最大长度的字节数组,该字节数组可以由类型 T 指定。我如何声明该缓冲区?我不能只使用 sizeof,因为它会返回类型 T 的大小(以字节为单位),而不是该类型可以包含的最大值。我不想使用 limits.h,因为底层类型可能会改变并且我的缓冲区太小。我不能使用 math.h 中的 pow,因为我需要一个常量表达式。那么,如何在 C 语言的编译时获取一个类型的最大大小的常量表达式呢?

编辑

类型将是无符号的。由于每个人似乎都对编译时确定的静态分配缓冲区的想法感到震惊,因此我将提供一些背景知识。这适用于优先考虑可靠性和速度的嵌入式应用程序(在微 Controller 上)。因此,为了运行时完整性(没有 malloc 问题)和性能(没有每次需要缓冲区时的内存分配开销),我完全同意浪费静态分配的内存。我理解如果 T 的最大大小太大,我的链接器将无法分配那么大的缓冲区的风险,但这将是一个编译时失败,可以容纳,而不是而不是运行时故障,这是不能容忍的。例如,如果我使用 size_t 作为有效负载的大小并动态分配内存,则系统很可能没有那么多可用内存。我更愿意在编译时知道这一点,而不是在运行时知道这会导致数据包丢失、数据损坏等。看看我提供的函数签名,为动态提供一个类型作为大小参数是荒谬的分配的缓冲区并且不期望调用者将使用该类型的最大值的可能性。所以我不确定为什么永远分配一次内存似乎如此令人惊愕。我可以看到这在 Windows 世界中是一个巨大的问题,在 Windows 世界中多个进程正在争夺相同的内存资源,但在嵌入式世界中,只有一项任务需要完成,如果你不能有效地做到这一点,那么它就不会”无论您节省了多少内存。

最佳答案

使用_Generic:

#define MAX_SIZE(X) _Generic((X),
long: LONG_MAX,
unsigned long: ULONG_MAX,
/* ... */)

在 C11 之前,没有一种可移植的方法来找到类型 T 对象的精确最大值(例如,所有使用 CHAR_BIT 的计算都可能由于填充位而产生高估)。

编辑:请注意,在某些情况下(想想现实生活中的分段内存),您可能无法分配足够大的缓冲区以等于任何给定类型 T 的最大值。

关于c - 声明足够大的数组来容纳一个类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12044955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com