Skip to content

Commit ca97073

Browse files
committed
Reduce the number of memory allocations when bridging
1 parent 4b6ff81 commit ca97073

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

apple/bridge/base/ObjectBridge.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,5 @@ void WCDBReleaseCPPObject(CPPObject* _Nonnull obj)
3636
if (obj->deleter != nullptr) {
3737
obj->deleter(obj->realValue);
3838
}
39-
delete obj;
39+
free(obj);
4040
}

apple/bridge/base/ObjectBridge.hpp

+16-6
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,13 @@ class ObjectBridge {
102102
bool isRecyclable = false)
103103
{
104104
static_assert(!std::is_same<T, CPPObject>::value, "");
105-
CPPObject* cppObj = new CPPObject();
105+
CPPObject* cppObj = (CPPObject*) malloc(sizeof(CPPObject));
106106
cppObj->realValue = (void*) obj;
107107
cppObj->isRecyclableObj = isRecyclable;
108108
if (autoRelease) {
109109
cppObj->deleter = releaseCPPObject<T>;
110+
} else {
111+
cppObj->deleter = nullptr;
110112
}
111113
return cppObj;
112114
}
@@ -118,11 +120,15 @@ class ObjectBridge {
118120
{
119121
static_assert(!std::is_same<T, CPPObject>::value, "");
120122
static_assert(std::is_copy_constructible<T>::value, "");
121-
CPPObject* cppObj = new CPPObject();
122-
cppObj->realValue = new T(obj);
123+
assert(autoRelease == true);
124+
CPPObject* cppObj = (CPPObject*) malloc(sizeof(CPPObject) + sizeof(T));
125+
cppObj->realValue = cppObj + 1;
126+
new (cppObj->realValue) T(obj);
123127
cppObj->isRecyclableObj = isRecyclable;
124128
if (autoRelease) {
125129
cppObj->deleter = releaseCPPObject<T>;
130+
} else {
131+
cppObj->deleter = nullptr;
126132
}
127133
return cppObj;
128134
}
@@ -134,11 +140,15 @@ class ObjectBridge {
134140
{
135141
static_assert(!std::is_same<T, CPPObject>::value, "");
136142
static_assert(std::is_copy_constructible<T>::value, "");
137-
CPPObject* cppObj = new CPPObject();
138-
cppObj->realValue = new T(std::move(obj));
143+
assert(autoRelease == true);
144+
CPPObject* cppObj = (CPPObject*) malloc(sizeof(CPPObject) + sizeof(T));
145+
cppObj->realValue = cppObj + 1;
146+
new (cppObj->realValue) T(std::move(obj));
139147
cppObj->isRecyclableObj = isRecyclable;
140148
if (autoRelease) {
141149
cppObj->deleter = releaseCPPObject<T>;
150+
} else {
151+
cppObj->deleter = nullptr;
142152
}
143153
return cppObj;
144154
}
@@ -159,7 +169,7 @@ class ObjectBridge {
159169
{
160170
T* typedObj = (T*) obj;
161171
if (typedObj != nullptr) {
162-
delete typedObj;
172+
typedObj->~T();
163173
}
164174
}
165175

0 commit comments

Comments
 (0)