Сообщение Re[4]: YAS: Yet Another Serialization от 18.09.2016 7:46
Изменено 18.09.2016 7:55 VTT
VTT>>Студия 2015: 77 предупреждений
VTT>>mingw (g++ 5.1): 356 предупреждений
VTT>>clang 3.9: 345 предупреждений
X>приведите лог хоть какого-то из компиляторов. и команду сборки. спасибо.
лог студии (32bit, /W4)
лог mingw
лог clang аналогичные настройкиg++ -s -o yas_test.exe -std=c++14 -O3 -g0 -fno-rtti -fomit-frame-pointer -fstrict-enums -fshort-wchar -fstrict-aliasing -fvisibility=hidden -fmessage-length=0 -Wall -Wextra -Wconversion -Wold-style-cast -Wpedantic -Wno-unknown-pragmas -I"../../include" -DRELEASE -DNDEBUG main.cpp -Wl,--subsystem,windows -shared-libstdc++ -shared-libgcc
VTT>>1) большие (а в наше время не особо большие) данные молча криво обрабатываются?
X>не поняд...
ar.write((std::uint32_t)string.length());// допустим длина 4Гб 16 Б, верхние байты будут отброшены, длина будет записана 16 Б
ar.write(&string[0], string.length()); // а тут запишутся все 4Гб 16 Б, при чтении из них будет прочитано только 16 Б, а остальные интерпретированы как продолжение архива
VTT>>2) &string[0] — это реально стремно
X>иначе придется константность снимать с c_str(). какие еще варианты?
когда строчка сохраняется — можно спокойно использовать data() const
if(!string.empty())
{
ar.write(string.data(), string.size());
}
когда извлекается — то при использовании современного компилятора по идее можно воспользоваться data() не const
string.resize(size);
if(!string.empty())
{
ar.read(string.data(), size);
}
ну а при использовании более старых — придется задействовать промежуточный буффер.
Конечно желание избежать такого бесполезного транжирства понятно, да и текущий код вроде как работает, но тем не менее...
Как минимум, не стоит дергать эти методы, когда строка пустая.
VTT>>ЗЫ не стоит прописывать в решениях полные пути типа D:\msys\home\niXmanX>а где ты нашел это?
В студийных проектах инклюды.
VTT>>Студия 2015: 77 предупреждений
VTT>>mingw (g++ 5.1): 356 предупреждений
VTT>>clang 3.9: 345 предупреждений
X>приведите лог хоть какого-то из компиляторов. и команду сборки. спасибо.
лог студии (32bit, /W4)
лог mingw
лог clangg++ -s -o yas_test.exe -std=c++14 -O3 -g0 -fno-rtti -fomit-frame-pointer -fstrict-enums -fshort-wchar -fstrict-aliasing -fvisibility=hidden -fmessage-length=0 -Wall -Wextra -Wconversion -Wold-style-cast -Wpedantic -Wno-unknown-pragmas -I"../../include" -DRELEASE -DNDEBUG main.cpp -Wl,--subsystem,windows -shared-libstdc++ -shared-libgcc
"C:\Program Files\LLVM\bin\clang.exe" -o yas.cl.exe -std=c++14 -O3 -g0 -fms-compatibility-version=19 -fcxx-exceptions -fomit-frame-pointer -fstrict-enums -fshort-wchar -fvisibility=hidden -fmessage-length=0 -Wall -Wextra -Wconversion -Wpedantic -Wold-style-cast -Wno-unknown-pragmas -DRELEASE -DNDEBUG -I"../../include" main.cpp
VTT>>1) большие (а в наше время не особо большие) данные молча криво обрабатываются?
X>не поняд...
ar.write((std::uint32_t)string.length());// допустим длина 4Гб 16 Б, верхние байты будут отброшены, длина будет записана 16 Б
ar.write(&string[0], string.length()); // а тут запишутся все 4Гб 16 Б, при чтении из них будет прочитано только 16 Б, а остальные интерпретированы как продолжение архива
VTT>>2) &string[0] — это реально стремно
X>иначе придется константность снимать с c_str(). какие еще варианты?
когда строчка сохраняется — можно спокойно использовать data() const
if(!string.empty())
{
ar.write(string.data(), string.size());
}
когда извлекается — то при использовании современного компилятора по идее можно воспользоваться data() не const
string.resize(size);
if(!string.empty())
{
ar.read(string.data(), size);
}
ну а при использовании более старых — придется задействовать промежуточный буффер.
Конечно желание избежать такого бесполезного транжирства понятно, да и текущий код вроде как работает, но тем не менее...
Как минимум, не стоит дергать эти методы, когда строка пустая.
VTT>>ЗЫ не стоит прописывать в решениях полные пути типа D:\msys\home\niXman\
X>а где ты нашел это?
В студийных проектах инклюды.