Ограничьте крупное выражение от копирования при использовании exprtkC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ограничьте крупное выражение от копирования при использовании exprtk

Сообщение Anonymous »

Currenty В моем проекте я использую exprtk для загрузки большого количества выражений, которые будут оцениваться в более поздний момент времени. Некоторые из выражений приходят локально, но другие поступают из внешних источников. Однако я не хочу загружать/компилировать выражения, которые потребуют большого количества памяти.
В качестве примера при использовании двойного типа следующее выражение будет, по крайней мере, 8008 байтов, приведенных 1001 удвоение (vars x и v):

Код: Выделить всё

var x := 123; var v[1000] := [1];  sum(2 * v / x);
< /code>
Примерно так, как работает мой поток загрузки: < /p>
typedef exprtk::symbol_table symbol_table_t;
typedef exprtk::expression   expression_t;
typedef exprtk::parser       parser_t;

std::vector expressionsList;

while (online)
{

std::string newExprString = getNextExpression(transportConext);

expression_t newExpression;

newExpression.register_symbol_table(globalSymbolTable);

auto usedResidentMemoryBefore = System::Utils::getResidentMemoryUsed();

if (!parser.compile(newExprString,newExpression))
{
handleCompilationError(oarser,newExprString);
continiue;
}

auto usedResidentMemoryAfter = System::Utils::getResidentMemoryUsed();

if ((usedResidentMemoryAfter - usedResidentMemoryBefore) > maxMemoryLimit)
{
handleExpressionError(newExprString);
continue;
}

// all is good add new expression
expressionList.push_back(newExpression);

}
Тип выражения exprtk не имеет метода размера, чтобы увидеть, каково это количество памяти, поэтому я использую функцию, которая получает резидентную память процесса, и называю ее до и после шагов компиляции.
Эта одновременно, что приведет к тому, что ложные срабатывания и негативы проходят или проваливают проверку. /> Короче говоря, я хочу отказаться от выражений, которые при составлении потребуют больше, чем заданный предел в памяти. < /p>

Подробнее здесь: https://stackoverflow.com/questions/796 ... ing-exprtk
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»