假设我得到了一个具有以下签名的函数:
void SendBytesAsync(unsigned char* data, T length)
我需要一个足够大的缓冲区来容纳可以由 type 指定的最大长度的字节数组T
。如何声明该缓冲区?我不能只使用sizeof
它,因为它将返回 T 类型的大小(以字节为单位),而不是该类型可以包含的最大值。我不想使用limits.h,因为基础类型可能会改变并且我的缓冲区太小。我不能使用 math.h 中的 pow 因为我需要一个常量表达式。那么如何在 C 的编译时获得一个类型的最大大小的常量表达式呢?
编辑
该类型将是无符号的。由于每个人似乎都对在编译时确定的静态分配缓冲区的想法感到震惊,所以我将提供一些背景知识。这适用于可靠性和速度是优先考虑的嵌入式应用程序(在微控制器上)。malloc
因此,为了运行时完整性(没有问题)和性能(每次我需要缓冲区时没有内存分配开销),我完全可以浪费静态分配的内存。我理解如果最大大小T
太大我的链接器将无法分配那么大的缓冲区的风险,但这将是编译时失败,可以适应,而不是运行时失败,这不能容忍。例如,如果我使用size_t
对于有效负载的大小和动态分配内存,系统很有可能没有那么多可用内存。我宁愿在编译时知道这一点,而不是在运行时这会导致数据包丢失、数据损坏等。看看我提供的函数签名,提供一个类型作为动态的大小参数是荒谬的分配的缓冲区并且不期望调用者将使用该类型的最大值的可能性。所以我不知道为什么似乎有这么多关于分配内存的惊愕,永远。我可以看到这在 Windows 世界中是一个巨大的问题,其中多个进程正在争夺相同的内存资源,但在嵌入式世界中,只有一项任务需要完成,如果你不能有效地做到这一点,那么它就不会。