C++ malloc小于8字节

C++ malloc小于8字节,c++,c,memory,malloc,C++,C,Memory,Malloc,malloc在堆上说4个字节有意义吗?因为malloc在内部使用时,通常会在32位系统上将其四舍五入为8字节边界,在64字节系统中为16字节边界 我需要分配一个存储一个或两个数字的字符串。因此,我最多需要3个字节(2个用于两位数,“\0”字符1个用于终止字符串)。想知道使用malloc 3是否有任何好处,我是否应该使用malloc 8 有什么想法吗?是的,只要求你需要的东西绝对有意义 分配器(malloc、new、VirtualAlloc或您拥有的任何东西)可能总是填充您的分配,但一般来说,这不

malloc在堆上说4个字节有意义吗?因为malloc在内部使用时,通常会在32位系统上将其四舍五入为8字节边界,在64字节系统中为16字节边界

我需要分配一个存储一个或两个数字的字符串。因此,我最多需要3个字节(2个用于两位数,“\0”字符1个用于终止字符串)。想知道使用malloc 3是否有任何好处,我是否应该使用malloc 8


有什么想法吗?

是的,只要求你需要的东西绝对有意义

分配器(
malloc
new
VirtualAlloc
或您拥有的任何东西)可能总是填充您的分配,但一般来说,这不是您的问题。
无论如何,由于不同规模的混合方案/不同池,它可能会比较小的分配更大

无论如何,除非您有大量的分配,否则不要担心这种开销,因此分配器开销可能是压垮骆驼的稻草

此外,分配器可能会被更改或简单地替换(为了更好的空间/时间性能、调试体验、容错性,仅仅因为),而且您真的不想泄露上一个分配器如何在代码中工作的所有细节


尤其是,您不想不遗余力地抵制由于更好地调整您的用例而带来的任何可能的改进。

是的,只要求您需要的东西是绝对有意义的

分配器(
malloc
new
VirtualAlloc
或您拥有的任何东西)可能总是填充您的分配,但一般来说,这不是您的问题。
无论如何,由于不同规模的混合方案/不同池,它可能会比较小的分配更大

无论如何,除非您有大量的分配,否则不要担心这种开销,因此分配器开销可能是压垮骆驼的稻草

此外,分配器可能会被更改或简单地替换(为了更好的空间/时间性能、调试体验、容错性,仅仅因为),而且您真的不想泄露上一个分配器如何在代码中工作的所有细节


尤其是,您不想不遗余力地抵制由于更好地调整您的用例而带来的任何可能的改进。

分配您需要的内容,不要担心内存使用

智能内存分配器将有单独的内存池来分配小块内存


例如,内存分配器可能有一个单独的内存池,用于分配小于8字节的项

分配您需要的内容,而不必担心内存使用

智能内存分配器将有单独的内存池来分配小块内存


例如,内存分配器可能有一个单独的内存池,用于分配小于8字节的项

最好要求所需的尺寸,而不是更大的数量

如果OP发现未来需要分配
0
字节,则有一个重要的例外情况


在这种情况下,像
malloc(0)
这样的分配器可能返回
NULL
或一个指针——这两种情况都是C规范允许的。这可能会混淆或破坏特别需要这两种情况之一的后续代码。因此,当代码需要分配<代码> 0 < /Code >字节时,考虑返回<代码> Malc(1)或<代码> NUL>代码>,不留到 MalOC(0)

< P>最好地请求所需的大小,而不是更大的量,以及

所回答的。 如果OP发现未来需要分配
0
字节,则有一个重要的例外情况


在这种情况下,像
malloc(0)
这样的分配器可能返回
NULL
或一个指针——这两种情况都是C规范允许的。这可能会混淆或破坏特别需要这两种情况之一的后续代码。因此,当代码需要分配<代码> 0 < /Code >字节时,考虑返回<代码> MaloC(1)< /Code >或<代码> null <代码>,不要将其保留到 Maloc(0)。

使用
std::string
并停止担心为字符串分配和释放内存。内存确实是问题,还是您只是在尝试优化?分配您需要的内存。如果您需要3个字节,而您要求8个字节,您会如何处理额外的5个字节?如果你对这5个字节有合法的用途,那么就定义一个8字节的结构,然后使用它。不管你是分配额外的字节而不使用它们,还是堆分配器使用它们,当然都没有什么区别。除了那个有朝一日不得不维护你的代码的倒霉的受害者。@iharob:可能。。。因为它对任何一方都同样有效。尽管这可能是巧合。请使用
std::string
,不要再担心为字符串分配和释放内存。内存真的是个问题吗?还是您只是在尝试优化?分配您需要的内存。如果您需要3个字节,而您要求8个字节,您会如何处理额外的5个字节?如果你对这5个字节有合法的用途,那么就定义一个8字节的结构,然后使用它。不管你是分配额外的字节而不使用它们,还是堆分配器使用它们,当然都没有什么区别。除了那个有朝一日不得不维护你的代码的倒霉的受害者。@iharob:可能。。。因为它对任何一方都同样有效。虽然这可能是巧合,这是一个重要的问题。而且imho是语言上的一个真正的问题,特别是当移动到
realoc
。需要分配
0
bytes吗?你能解释一下为什么有人会故意这么做吗?@fiddlingBits,是的,我有过这样的情况,我想分配一个可变的空间量,在这种情况下可能是0,你必须小心:
malloc(nbytes)
返回
NULL
不一定是
nbytes==0
的错误,在下面的步骤中,一个可能导致另一个,因此您只需决定始终分配