у класса есть метод, в нём объявлена static переменная, вот так
void OnReceive() {
const int BUFFER_STATIC_SIZE = 65*1024;
static char BBB[BUFFER_STATIC_SIZE];
Обычно переменная BBB не занимает место в exe.
На gcc v4.8 on Linux — всё нормально, exe не увеличивается.
На gcc v10.2 on Windows, если метод в cpp то всё нормально, но если в header, то в exe добавляется 65Кб и заполняется нулями. Но зачем ?
Это баг gcc или так и должно быть ?
Почему выделение или не выделения места в exe для BBB зависит от того в cpp или h файле реализован метод ?
Может ли перемещенние данного буфера на стек замедлить скорость работы ?
Вызов call ___chkstk_ms, в начале функции для проверки есть ли место в стеке ?
Так как адрес статической переменной фиксирован, адрес на стеке динамический. Дополнительное вычисление адреса ?
Работа кэш памяти может быть хуже со стеком ?
Здравствуйте, maks1180, Вы писали:
M>у класса есть метод, в нём объявлена static переменная, вот так M>void OnReceive() { M> const int BUFFER_STATIC_SIZE = 65*1024; M> static char BBB[BUFFER_STATIC_SIZE];
M>Обычно переменная BBB не занимает место в exe. M>На gcc v4.8 on Linux — всё нормально, exe не увеличивается. M>На gcc v10.2 on Windows, если метод в cpp то всё нормально, но если в header, то в exe добавляется 65Кб и заполняется нулями. Но зачем ?
M>Это баг gcc или так и должно быть ? M>Почему выделение или не выделения места в exe для BBB зависит от того в cpp или h файле реализован метод ?
M>Может ли перемещенние данного буфера на стек замедлить скорость работы ?
M>Вызов call ___chkstk_ms, в начале функции для проверки есть ли место в стеке ? M>Так как адрес статической переменной фиксирован, адрес на стеке динамический. Дополнительное вычисление адреса ? M>Работа кэш памяти может быть хуже со стеком ?
Использовать оператора sizeof попробуй, по моему твой случай называеться сужающееся преобразование
M>Обычно переменная BBB не занимает место в exe. M>На gcc v4.8 on Linux — всё нормально, exe не увеличивается. M>На gcc v10.2 on Windows, если метод в cpp то всё нормально, но если в header, то в exe добавляется 65Кб и заполняется нулями. Но зачем ?
А какие ключи при сборке используются? Был параметр чтобы компилятор засовывал такое не в bss, а в data.
Самый простой способ – взять тот же компилятор и попробовать тестовый файл собрать, с одной функцией и статической переменной.
M>Может ли перемещенние данного буфера на стек замедлить скорость работы ? M>Вызов call ___chkstk_ms, в начале функции для проверки есть ли место в стеке ? M>Так как адрес статической переменной фиксирован, адрес на стеке динамический. Дополнительное вычисление адреса ? M>Работа кэш памяти может быть хуже со стеком ?
У тебя жёсткий рилтайм на слабых процессорах что ли? Больше смущает то что OnReceive нельзя одновременно несколько раз вызывать и это не проверяется.
M>>Может ли перемещенние данного буфера на стек замедлить скорость работы ? M>>Вызов call ___chkstk_ms, в начале функции для проверки есть ли место в стеке ? M>>Так как адрес статической переменной фиксирован, адрес на стеке динамический. Дополнительное вычисление адреса ? M>>Работа кэш памяти может быть хуже со стеком ? DS>У тебя жёсткий рилтайм на слабых процессорах что ли? Больше смущает то что OnReceive нельзя одновременно несколько раз вызывать и это не проверяется.
Процессор не слабый, нагрузка большая на софт, более 100 тыс TCP соединений.
OnReceive вызывается только одним потом, поэтому static можно использовать.