对于a char [],我可以很容易地得到它的长度:
char a[] = "aaaaa";
int length = sizeof(a)/sizeof(char); // length=6
Run Code Online (Sandbox Code Playgroud)
但是,我不能这样做以获得a的长度char *:
char *a = new char[10];
int length = sizeof(a)/sizeof(char);
Run Code Online (Sandbox Code Playgroud)
因为,我知道,a这里是一个指针,所以length这里将永远是4(或不同系统中的其他东西).
我的问题是,如何才能获得char *事后的长度?我知道有人可能会挑战我你已经知道它,10因为你刚刚创造了它.我想知道这一点,因为这个获得它的长度的步骤可能会从它的创建中走很长一段路,而且我不想长时间回来检查这个数字.而且,我也想知道它的实际长度.
更具体
length=5?length=10?对于以下示例:
char *a = new char[10];
strcpy(a, "hello");
Run Code Online (Sandbox Code Playgroud) 我有一个图像压缩应用程序,现在有两个不同版本的内存分配系统.在最初的一个中,malloc在任何地方使用,在第二个中,我实现了一个简单的池分配器,它只分配一块内存并将部分内存返回给myalloc()调用.
我们在使用malloc时注意到了巨大的内存开销:在内存使用的高度,malloc()代码需要大约170兆字节的内存用于1920x1080x16bpp映像,而池分配器只分配48兆字节,其中47由程序使用.
在内存分配模式方面,程序为测试映像分配了大量8字节(大多数),32字节(许多)和1080字节块(一些).除此之外,代码中没有动态内存分配.
测试系统的操作系统是Windows 7(64位).
我们如何测试内存使用情况?
使用自定义分配器,我们可以看到使用了多少内存,因为所有malloc调用都被赋予分配器.使用malloc(),在调试模式下,我们只需逐步执行代码并在任务管理器中查看内存使用情况.在发布模式下我们也做了同样的事情,但由于编译器优化了很多东西,所以我们无法逐步完成代码(发布和调试之间的内存差异大约为20MB,我将其归因于在发布模式下优化和缺少调试信息).
可以单独使用malloc是导致如此巨大开销的原因吗?如果是这样,究竟是什么原因导致malloc内部的开销?