mirror of
https://github.com/json-c/json-c.git
synced 2026-03-13 18:19:06 +08:00
smalls strings inside json_objects had a high overhead because dynamic memory allocation was needed for each of them. This also meant that the pointer needed to be updated. This is now changed so that small strings can directly be stored inside the json_object. Note that on the regular 64 bit machines a pointer takes 8 bytes. So even without increasing memory, we could store string up to 7 bytes directly inside the object. The max size is configurable. I have selected up to 31 bytes (which means a buffer of 32 including the NUL byte). This brings a 24-bytes memory overhead, but I consider that still useful because the memory allocator usually also has quite some overhead (16 bytes) for dyn alloced memory blocks. In any case, the max buffer size can be tweaked via #define.
56 lines
1.2 KiB
C
56 lines
1.2 KiB
C
/*
|
|
* $Id: json_object_private.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
|
|
*
|
|
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
|
* Michael Clark <michael@metaparadigm.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
* it under the terms of the MIT license. See COPYING for details.
|
|
*
|
|
*/
|
|
|
|
#ifndef _json_object_private_h_
|
|
#define _json_object_private_h_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define LEN_DIRECT_STRING_DATA 32 /**< how many bytes are directly stored in json_object for strings? */
|
|
|
|
typedef void (json_object_private_delete_fn)(struct json_object *o);
|
|
|
|
struct json_object
|
|
{
|
|
enum json_type o_type;
|
|
json_object_private_delete_fn *_delete;
|
|
json_object_to_json_string_fn *_to_json_string;
|
|
int _ref_count;
|
|
struct printbuf *_pb;
|
|
union data {
|
|
json_bool c_boolean;
|
|
double c_double;
|
|
int64_t c_int64;
|
|
struct lh_table *c_object;
|
|
struct array_list *c_array;
|
|
struct {
|
|
union {
|
|
/* optimize: if we have small strings, we can store them
|
|
* directly. This saves considerable CPU cycles AND memory.
|
|
*/
|
|
char *ptr;
|
|
char data[LEN_DIRECT_STRING_DATA];
|
|
} str;
|
|
int len;
|
|
} c_string;
|
|
} o;
|
|
json_object_delete_fn *_user_delete;
|
|
void *_userdata;
|
|
};
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|