我想制作自己的malloc/free,这样我就可以制作精确的复制分配器.
任何大师都有任何提示和建议吗?
我现在有几个问题:
有人可以向我解释为什么我对字符串大小为6的malloc的调用返回4字节的sizeof?事实上,我给malloc的任何整数参数我得到sizeof为4.接下来,我试图复制两个字符串.为什么我复制的字符串输出(NULL)?以下是我的代码:
int main()
{
char * str = "string";
char * copy = malloc(sizeof(str) + 1);
printf("bytes allocated for copy: %d\n", sizeof(copy));
while(*str != '\0'){
*copy = *str;
str++;
copy++;
}
copy = '\0';
printf("%s\n", copy);
}
Run Code Online (Sandbox Code Playgroud) 为什么new()/ delete()比malloc()/ free()慢?
谢谢你到目前为止的答案.如果你有它们,请指出new()和delete()的标准C++实现的规范!
我需要一个使用一个大的固定大小缓冲区的通用malloc实现.与SQLite 的" Zero-malloc内存分配器 " 类似的东西.你知道任何这样的实现吗?它应该重量轻,便于携带,可用于嵌入式应用.
提前致谢.
我一直在使用openmp框架进行一些实验,发现了一些奇怪的结果,我不知道我知道如何解释.
我的目标是创建这个巨大的矩阵,然后用值填充它.为了从多线程环境中获得性能,我将代码的某些部分作为并行循环.我在一台配有2个四核xeon处理器的机器上运行它,所以我可以安全地在那里放置8个并发线程.
一切都按预期工作,但由于某种原因,实际分配矩阵行的for循环在仅运行3个线程时具有奇怪的峰值性能.从那以后,添加更多线程只会让我的循环花费更长时间.8个线程实际上只需要一个线程就可以获得更多时间.
这是我的并行循环:
int width = 11;
int height = 39916800;
vector<vector<int> > matrix;
matrix.resize(height);
#pragma omp parallel shared(matrix,width,height) private(i) num_threads(3)
{
#pragma omp for schedule(dynamic,chunk)
for(i = 0; i < height; i++){
matrix[i].resize(width);
}
} /* End of parallel block */
Run Code Online (Sandbox Code Playgroud)
这让我想知道:在多线程环境中调用malloc(我想是矢量模板类的resize方法实际调用的)时是否存在已知的性能问题?我在一个多线程环境中发现了一些关于释放堆空间性能损失的文章,但没有具体说明在这种情况下分配新空间.
举一个例子,我将下面的图表显示循环完成所需的时间作为分配循环的线程数的函数,以及一个只读取来自这个巨大矩阵的数据的正常循环稍后的.


两次使用gettimeofday函数测量并且似乎在不同的执行实例中返回非常相似和准确的结果.那么,任何人都有一个很好的解释?
在linux系统中,pthreads库为我们提供了一个用于缓存对齐的函数(posix_memalign),以防止错误共享.并且要选择arhitecture的特定NUMA节点,我们可以使用libnuma库.我想要的是需要两者的东西.我将某些线程绑定到某些某些处理器,并且我希望为来自相应NUMA节点的每个线程分配本地数据结构,以减少线程的内存操作延迟.我怎样才能做到这一点?
我有一个图像压缩应用程序,现在有两个不同版本的内存分配系统.在最初的一个中,malloc在任何地方使用,在第二个中,我实现了一个简单的池分配器,它只分配一块内存并将部分内存返回给myalloc()调用.
我们在使用malloc时注意到了巨大的内存开销:在内存使用的高度,malloc()代码需要大约170兆字节的内存用于1920x1080x16bpp映像,而池分配器只分配48兆字节,其中47由程序使用.
在内存分配模式方面,程序为测试映像分配了大量8字节(大多数),32字节(许多)和1080字节块(一些).除此之外,代码中没有动态内存分配.
测试系统的操作系统是Windows 7(64位).
我们如何测试内存使用情况?
使用自定义分配器,我们可以看到使用了多少内存,因为所有malloc调用都被赋予分配器.使用malloc(),在调试模式下,我们只需逐步执行代码并在任务管理器中查看内存使用情况.在发布模式下我们也做了同样的事情,但由于编译器优化了很多东西,所以我们无法逐步完成代码(发布和调试之间的内存差异大约为20MB,我将其归因于在发布模式下优化和缺少调试信息).
可以单独使用malloc是导致如此巨大开销的原因吗?如果是这样,究竟是什么原因导致malloc内部的开销?
请考虑以下代码:
struct Node {
void* data;
int ref;
struct Node* next;
};
typedef struct Node* NodePtr;
Run Code Online (Sandbox Code Playgroud)
我发现每当我尝试使用NodePtr的字段做任何事情时,我都会遇到段错误.例如:
NodePtr node;
node->ref = 1;
Run Code Online (Sandbox Code Playgroud)
所以我为NodePtr分配了一些空间,现在它似乎工作正常.为什么是这样?我的猜测是,由于节点只是一个指针,它的字段没有内存.
所以我尝试初始化NodePtr:
NodePtr node = {
node->data = 0;
node->next = NULL;
node->ref = 0;
};
Run Code Online (Sandbox Code Playgroud)
好吧,我收到了这个错误:
error: expected â}â before â;â token
Run Code Online (Sandbox Code Playgroud)
这归结为四个问题:
char *无论存储器1的现有内容如何,我都希望写入缓冲区花费相同的时间.不是吗?
然而,在缩小基准测试中的不一致性时,我遇到了一个显然不是这样的情况.包含全零的缓冲区在性能方面与填充缓冲区的缓冲区有很大不同42.
从图形上看,这看起来像(详情如下):
这是我用来制作上述3的代码:
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>
#include <time.h>
volatile char *sink;
void process(char *buf, size_t len) {
clock_t start = clock();
for (size_t i = 0; i < len; i += 678)
buf[i] = 'z';
printf("Processing took %lu ?s\n",
1000000UL * (clock() - start) / CLOCKS_PER_SEC);
sink = buf;
}
int main(int argc, char** argv) {
int total = 0;
int memset42 = argc > 1 …Run Code Online (Sandbox Code Playgroud) 简单的代码(下面,在100个线程中运行malloc()/ free()序列)在我尝试运行的任何Windows操作系统上崩溃.
任何帮助将不胜感激.
也许使用一些编译器的指令可以帮忙吗?
我们在Release/x64中在VS2017中构建exe; 可执行文件在运行几分钟后尝试的任何Windows平台上崩溃.
我尝试用VS2015构建,但它没有帮助.
Linux上的相同代码运行正常.
实际上,问题比它看起来更严重; 我们遇到的情况是,我们的服务器代码在生产环境中每天多次崩溃而没有任何理由(当用户调用的数量超过某个值时).我们试图确定问题并创建最简单的解决方案来重现问题.
存档与VS项目在这里.
VS说命令行是:
/Yu"stdafx.h" /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc140.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\MallocTest.pch"
码:
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <conio.h>
using namespace std;
#define MAX_THREADS 100
void task(void) {
while (true) {
char *buffer;
buffer = (char *)malloc(4096);
if (buffer == NULL) {
cout << …Run Code Online (Sandbox Code Playgroud)