"Dmitriy V'jukov" <dvyukov@[EMAIL PROTECTED]
> wrote in message
news:68aa47ab-a67b-46d3-8dac-26fdf4df4f06@[EMAIL PROTECTED]
Oct 2, 10:55 pm, "Chris M. Thomasson" <n...@[EMAIL PROTECTED]
> wrote:
> > I think C++ is neat, but I have to sup****t C.
> You can mimic this pattern in C:
> [...]
> It's still not global malloc/free, and user still have to supply exact
> size of allocation to free(). But it's C.
Humm... What do you think about the following technique; here is a full
example program:
_________________________________________________________________________
#include <stdio.h>
#include <stdlib.h>
static void*
thread_alloc_4(size_t size) {
void* const mem = malloc(size);
printf("thread_alloc_4(%lu) -> %p\n",
(unsigned long int)size, mem);
return mem;
}
static void
thread_free_4(void* mem, size_t size) {
printf("thread_free_4(%lu) -> %p\n",
(unsigned long int)size, mem);
free(mem);
}
static void*
thread_alloc_8(size_t size) {
void* const mem = malloc(size);
printf("thread_alloc_8(%lu) -> %p\n",
(unsigned long int)size, mem);
return mem;
}
static void
thread_free_8(void* mem, size_t size) {
printf("thread_free_8(%lu) -> %p\n",
(unsigned long int)size, mem);
free(mem);
}
#define MALLOC(mp_ptr) ( \
(sizeof(*(mp_ptr)) <= 4) \
? thread_alloc_4(sizeof(*(mp_ptr))) \
: (sizeof(*(mp_ptr)) <= 8) \
? thread_alloc_8(sizeof(*(mp_ptr))) \
: malloc(sizeof(*(mp_ptr))) \
)
#define FREE(mp_ptr) ( \
(sizeof(*(mp_ptr)) <= 4) \
? thread_free_4((mp_ptr), sizeof(*(mp_ptr))) \
: (sizeof(*(mp_ptr)) <= 8) \
? thread_free_8((mp_ptr), sizeof(*(mp_ptr))) \
: free((mp_ptr)) \
)
struct foo1 {
int a;
};
struct foo2 {
int a;
int b;
};
struct foo3 {
char mem[6];
};
int main() {
struct foo1* f1 = MALLOC(f1);
struct foo2* f2 = MALLOC(f2);
struct foo3* f3 = MALLOC(f3);
FREE(f3);
FREE(f2);
FREE(f1);
return 0;
}
_________________________________________________________________________
Humm... That should work fine.


|