假設我想要一個可變大小的數組,其中有一個標頭的位存儲在std::shared_ptr
中。我可以做類似shared_ptr中的可變大小對象
#include <memory>
using namespace std;
struct obj {
char headerCode;
unique_ptr<short[]> data;
};
shared_ptr<obj> make(unsigned len) {
return shared_ptr<obj>{new obj{'x', unique_ptr<short[]>{new short[len]}}};
}
但是,這會導致三種分配:一個用於shared_ptr
控制塊,一爲obj
和一個用於其data
。隨着make_shared
有可能是前兩個共享一些內存:
#include <memory>
using namespace std;
struct obj {
char headerCode;
unique_ptr<short[]> data;
obj(char headerCode, short data[]) : headerCode(headerCode), data(data) {}
};
shared_ptr<obj> make(unsigned len) {
return make_shared<obj>('x', new short[len]);
}
與低級別的分配,我可以讓對象及其數據共享一些內存:
#include <memory>
#include <cstdlib>
using namespace std;
struct obj {
char headerCode;
short data[0];
};
shared_ptr<obj> make(unsigned len) {
obj* o = reinterpret_cast<obj*>(malloc(sizeof(obj) + len*sizeof(short)));
o->headerCode = 'x';
return shared_ptr<obj>(o, free);
}
是通過允許這兩種技術標準?如果沒有,是否有類似的東西是允許的?有沒有什麼能夠以符合標準的方式使這項工作只有一個內存分配?最好不必在每個實例中存儲分配器或刪除器對象?
爲什麼使用'reinterpret_cast'將'void *'轉換爲'obj *'? – 2015-04-04 23:22:05
@JonathanWakely:沒有明確地施放我的'g ++'說'錯誤:從'void *'無效轉換爲'obj *'[-fpermissive]'。但是你說得對,這裏'static_cast'可能更合適。 – MvG 2015-04-04 23:26:59
是的,當然它不會隱式轉換,但'reinterpret_cast'是一個大錘,在這裏沒有必要。 'static_cast'是所有需要的。 – 2015-04-04 23:28:02