История изменений
Исправление Pavval, (текущая версия) :
_если_ ты точно знаешь, что всё, что тебе надо - это всего int + string + blob, то пишешь говнокодом в лоб, используя платформенно-независимые типы:
std::string str = ...;
int32_t i = ...;
std::vector<char> buf = ...;
size_t size = sizeof(uint64_t) + str.size() + sizeof(i) + sizeof(uint64_t) + buf.size();
std::unique_ptr<char> data(new char[size]);
char* ptr = data.get();
memcpy(ptr, static_cast<uint64_t>(str.size()), sizeof(uint64_t));
ptr += sizeof(uint64_t);
memcpy(ptr, str.c_str(), str.size());
ptr += str.size();
memcpy(ptr, i, sizeof(i));
ptr += sizeof(i);
memcpy(ptr, static_cast<uint64_t>(buf.size()), sizeof(uint64_t));
ptr += sizeof(uint64_t);
memcpy(ptr, &buf[0], buf.size());
ptr += buf.size();
writefile(data.get(), size);
На endianness забиваешь, пока реально в твоей жизни не появится полумертвая платформа, где endianness другой. Да и buf небось у тебя тоже зависит от endianness.
Этот говнокод лучше чем тормозной stringstream за счет минимального кол-ва аллокаций памяти/копирования.
Исправление Pavval, :
_если_ ты точно знаешь, что всё, что тебе надо - это всего int + string + blob, то пишешь говнокодом в лоб, используя платформенно-независимые типы:
std::string str = ...;
int32_t i = ...;
std::vector<char> buf = ...;
size_t size = sizeof(uint64_t) + str.size() + sizeof(i) + sizeof(uint64_t) + buf.size();
std::unique_ptr<char> data(new char[size]);
char* ptr = data.get();
memcpy(ptr, static_cast<uint64_t>(str.size()), sizeof(uint64_t));
ptr += sizeof(uint64_t);
memcpy(ptr, str.c_str(), str.size());
ptr += str.size();
memcpy(ptr, i, sizeof(i));
ptr += sizeof(i);
memcpy(ptr, static_cast<uint64_t>(buf.size()), sizeof(uint64_t));
ptr += sizeof(uint64_t);
memcpy(ptr, &buf[0], buf.size());
ptr += buf.size();
writefile(data.get(), size);
На endianness забиваешь, пока реально в твоей жизни не появится полумертвая платформа, где endianness другой. Да и buf небось у тебя тоже зависит от endianness.
Этот говнокод лучше чем тормозной stringsteam за счет минимального кол-ва аллокаций памяти/копирования.
Исходная версия Pavval, :
_если_ ты точно знаешь, что всё, что тебе надо - это всего int + string + blob, то пишешь говнокодом влоб, используя платформенно-независимые типы:
std::string str = ...;
int32_t i = ...;
std::vector<char> buf = ...;
size_t size = sizeof(uint64_t) + str.size() + sizeof(i) + sizeof(uint64_t) + buf.size();
std::unique_ptr<char> data(new char[size]);
char* ptr = data.get();
memcpy(ptr, static_cast<uint64_t>(str.size()), sizeof(uint64_t));
ptr += sizeof(uint64_t);
memcpy(ptr, str.c_str(), str.size());
ptr += str.size();
memcpy(ptr, i, sizeof(i));
ptr += sizeof(i);
memcpy(ptr, static_cast<uint64_t>(buf.size()), sizeof(uint64_t));
ptr += sizeof(uint64_t);
memcpy(ptr, &buf[0], buf.size());
ptr += buf.size();
writefile(data.get(), size);
На endianness забиваешь, пока реально в твоей жизни не появится полумертвая платформа, где endianness другой. Да и buf небось у тебя тоже зависит от endianness.
Этот говнокод лучше чем тормозной stringsteam за счет минимального кол-ва аллокаций памяти/копирования.