⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vnew.cpp

📁 c库的部分源代码 用惯了操作系统提供的内存api,你是否了解系统的运行机制,这是提供动态内存分配最简单的实现代码 静态的代码库 可用各种c编译
💻 CPP
字号:
/****************************************************************
	Copyright 1993 Software Development Systems, Inc.
	All rights reserved

	C++ Runtime Support -- _vector_new/delete/apply
****************************************************************/
#include "new.h"

/********************************************************
    Prototypes are needed to avoid warning messages.
    They are not in a header file because they are
    internal calls generated by the compiler.
********************************************************/
extern "C++" {
void *_vector_new(void *, size_t, size_t, int, void (*)(void *));
void _vector_delete(void *, size_t, size_t, int, void (*)(void *, int));
void _vector_apply(void *, void *, size_t, size_t, void (*)(void *, void *));
}

#define DTOR_DVB 0x02	// must agree with definition in cxx.h!

/****************************************************************
	_vector_new: construct array of class objects.
****************************************************************/
void *_vector_new(void *ptr, size_t objsize, size_t totsize, int flags,
	void (*ctor)(void *))
{
    size_t extra, offset = 0;
    char *p;

    if (!ptr)
    {			// allocate memory
	p = (char *)ptr;
	extra = flags ? sizeof(size_t) : 0;
	p = (char *)operator new(totsize + extra);
	if (!p)
	    return 0;		// return 0 if allocation fails
	if (extra)
	{			// save array size
	    *(size_t *)p = totsize;
	    p += extra;
	}
	ptr = p;
    }
    p = (char *)ptr;
    while (offset < totsize)
    {
	ctor(p);		// call constructor
	p += objsize;
	offset += objsize;
    }
    return ptr;			// return pointer to array
}
/****************************************************************
	_vector_delete: destroy array of class objects.
****************************************************************/
void _vector_delete(void *ptr, size_t objsize, size_t totsize, int flags,
	void (*dtor)(void *, int))
{
    size_t count = 0;
    char *p;

    if (!ptr) return;		// return if not allocated
    p = (char *)ptr;
    if (flags)
    {			// get size of array
	p -= sizeof(size_t);
	totsize = *(size_t *)p;
	ptr = p;
	p += sizeof(size_t);
    }
    p += totsize;
    while (count < totsize)
    {
	p -= objsize;
	dtor(p, DTOR_DVB);	// call destructor
	count += objsize;
    }
    if (flags)
	operator delete(ptr);	// deallocate memory
}
/****************************************************************
	_vector_apply: copy array of class objects.
****************************************************************/
void _vector_apply(void *dest, void *src, size_t size, size_t count,
	void (*func)(void *, void *))
{
    size_t n;
    char *dp, *sp;

    dp = (char *)dest;
    sp = (char *)src;
    for (n = 0; n < count; n++)
    {
	(*func)(dp, sp);
	dp += size;
	sp += size;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -