powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / sizeof( strcuct {string} )?
21 сообщений из 46, страница 2 из 2
sizeof( strcuct {string} )?
    #39611749
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TSashaMercuryПару раз прочитал, не очень понятно. Почему при сортировке с использованием стандартных функций С и С++ мы можем ожидать в качестве побочного эффекта изменение сортируемых объектов?
Наоборот: объекты не меняются, но должны, т.к. внутри string буфер и указатель на этот буфер.
Выше пример кода который сглючит 21224926 и 21226275

Ничего там ломаться не должно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#define DEFBUFFSZ 16

union mbuffs
{
char  fbuff[DEFBUFFSZ];
char* vbuff;
};

class sbuffs
{
mbuffs s_str;        // buffer
unsigned int s_size;
.....


inline  operator char*()    
      {     
       if(s_size>=DEFBUFFSZ-1)
               return s_str.vbuff;
       return &s_str.fbuff[0];
       };
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611909
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
д0kХ
Код: plaintext
1.
2.
3.
4.
5.
6.
inline  operator char*()    
      {     
       if(s_size>=DEFBUFFSZ-1)
               return s_str.vbuff;
       return &s_str.fbuff[0];
       };



Так ИМХО будет оптимальнее, если стековую строку дефайнить на не менее чем
на 2 машинных слова.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
inline  operator char*()    
      {     
        switch  ( s_str.fbuff[DEFBUFFSZ-1] )
          {
          case '0xFF':  return  s_str.vbuff;        break; 
          case  '0х00':  return &s_str.fbuff[0];  break; 
          default : throw  internal_mem_corruption;
        };
       };



Не проверял .
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611937
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХ,

if (или switch) могут влиять на процессорные оптимизации, поэтому указатель желательно хранить уже вычисленным.
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611938
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж делать позиционно независимые строки, то вместо указателя можно хранить смещение к нему относительно this
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611948
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyЕсли уж делать позиционно независимые строки, то вместо указателя можно хранить смещение к нему относительно this
Вот меня удивляет, почему в gcc так не сделали.
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611951
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХНичего там ломаться не должно:
Код: plaintext
1.
2.
3.
4.
5.
6.
inline  operator char*()    
      {     
       if(s_size>=DEFBUFFSZ-1)
               return s_str.vbuff;
       return &s_str.fbuff[0];
       };


Да, так не сломается, но так работает быстрее
Код: plaintext
1.
2.
3.
4.
inline  operator char*()    
      {     
               return s_str.vbuff;
       };
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611953
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕсли уж делать позиционно независимые строки, то вместо указателя можно хранить смещение к нему относительно this
Не поможет, т.к. для больших строк выделение памяти через malloc(), т.е. за пределами объекта.
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611957
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе поможет, т.к. для больших строк выделение памяти через malloc(), т.е. за пределами объекта.
Так смещение тоже может указывать за пределы объекта )))
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611960
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинВот меня удивляет, почему в gcc так не сделали.
Потому что такие строки все равно никому не нужны.
Как выше написали все равно такое использование строк - UB
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611964
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskyд0kХ,

if (или switch) могут влиять на процессорные оптимизации, поэтому указатель желательно хранить уже вычисленным.

Он вычислен
начало массива лежащего в стеке, преобразуется в
указатель на строку через ссылку на нулевой элемент.
либо из самого массива берется указатель.
В зависимости от длины строки возвращается либо то либо другое.
Что бы не хранить размер ( сэкономить sizeof(int) на каждом элементе массива строк
в последенм примере в последнем байте массива строки фиксированной длины
хранится либо 0х00 как в последеднем байте любой строки.
либо 0хFF если первое слово в массие является указателем на строку.

Если не то и не другое , значит кто то покоцал память .
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611968
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tд0kХНичего там ломаться не должно:
Код: plaintext
1.
2.
3.
4.
5.
6.
inline  operator char*()    
      {     
       if(s_size>=DEFBUFFSZ-1)
               return s_str.vbuff;
       return &s_str.fbuff[0];
       };


Да, так не сломается, но так работает быстрее
Код: plaintext
1.
2.
3.
4.
inline  operator char*()    
      {     
               return s_str.vbuff;
       };



Быстрее оно до тех пор, пока вы
не присумируете туда время 100500 вызовов new и delete
для строк меньше 16 байт.
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611973
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
д0kХAnatoly Moskovskyд0kХ,

if (или switch) могут влиять на процессорные оптимизации, поэтому указатель желательно хранить уже вычисленным.

Он вычислен .
if/switch - это и есть вычисления для предсказателя переходов, причем с учетом ошибок предсказания - это статистически очень долгие операции.

Весь вопрос в том, где лучше оставить if/switch:
- либо в operator char*() , как у вас
- либо в operator=(), как я приводил пример и как видимо у gcc 5.1 (раз у них ломается)

Что реже вызывается, там и надо оставлять. Видимо в GCC посчитали, что объект меняется реже, чем читается (или меняются только отдельные ячейки строки).
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611981
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинВесь вопрос в том, где лучше оставить if/switch:
- либо в operator char*() , как у вас
- либо в operator=(), как я приводил пример и как видимо у gcc 5.1 (раз у них ломается)

Что реже вызывается, там и надо оставлять. Видимо в GCC посчитали, что объект меняется реже, чем читается (или меняются только отдельные ячейки строки).
В присвоении по любому этот if есть ))
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611988
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася Уткинд0kХпропущено...


Он вычислен .
if/switch - это и есть вычисления для предсказателя переходов, причем с учетом ошибок предсказания - это статистически очень долгие операции.

Весь вопрос в том, где лучше оставить if/switch:
- либо в operator char*() , как у вас
- либо в operator=(), как я приводил пример и как видимо у gcc 5.1 (раз у них ломается)

Что реже вызывается, там и надо оставлять. Видимо в GCC посчитали, что объект меняется реже, чем читается (или меняются только отдельные ячейки строки).


Вычислен это как минумум одно лишнее машинное слово в классе.
И это где то 50 % размера строки.

Сейчас оперативную память наверное никто не считает.

Но мне очень кажется, что десяток тактов процессра дешевле
одного машинного слова метаданных в ОЗУ .

ВСЕ ИМХО

Как думают создатели GCC мне не ведомо.
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39611999
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В случае со switch и расчетом на лету
в кеше процессора поместится гораздо больше элементов массива строк.
чем с предрасчитанным и хранящимся в отдельном поле класса указателем.


по хорошему тестить надо.

В топик вызывается Майтон :)
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39612001
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
д0kХВася Уткинпропущено...

if/switch - это и есть вычисления для предсказателя переходов, причем с учетом ошибок предсказания - это статистически очень долгие операции.

Весь вопрос в том, где лучше оставить if/switch:
- либо в operator char*() , как у вас
- либо в operator=(), как я приводил пример и как видимо у gcc 5.1 (раз у них ломается)

Что реже вызывается, там и надо оставлять. Видимо в GCC посчитали, что объект меняется реже, чем читается (или меняются только отдельные ячейки строки).


Вычислен это как минумум одно лишнее машинное слово в классе.
И это где то 50 % размера строки.

Сейчас оперативную память наверное никто не считает.

Но мне очень кажется, что десяток тактов процессра дешевле
одного машинного слова метаданных в ОЗУ .

ВСЕ ИМХО

Как думают создатели GCC мне не ведомо.
Чем новее процессор, тем в нем больше суперскалярных ALU-ports, и тем больше ALU будут простаивать при ошибке предсказания перехода. А кэш и память увеличиваются (за исключением L1), так что в перспективе думаю выгоднее больше памяти затратить.
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39612018
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася Уткинд0kХпропущено...



Вычислен это как минумум одно лишнее машинное слово в классе.
И это где то 50 % размера строки.

Сейчас оперативную память наверное никто не считает.

Но мне очень кажется, что десяток тактов процессра дешевле
одного машинного слова метаданных в ОЗУ .

ВСЕ ИМХО

Как думают создатели GCC мне не ведомо.
Чем новее процессор, тем в нем больше суперскалярных ALU-ports, и тем больше ALU будут простаивать при ошибке предсказания перехода. А кэш и память увеличиваются (за исключением L1), так что в перспективе думаю выгоднее больше памяти затратить.

Понятное дело .

Я лет 15-20 назад, когда это писал
решал конкретную практическую задачу минимизации вызовов аллокации - деаллокации памяти
для коротких строк.
но некоторый небольшой % строк в массивах могли быть длинными.

Если у автора топика есть разумное ограничение на длину строки,
то задача решится достаоточно просто, без забивания саморезов микроскопом.
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39612214
Siemarglнет там грязных хаков.
Да. Есть всего лишь UB.
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39612224
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот Вася. А я вить предупреждал.
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39612231
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonНу вот Вася. А я вить предупреждал.
Скоро у меня будет целая секта с блекджеком и последователями
...
Рейтинг: 0 / 0
sizeof( strcuct {string} )?
    #39612353
д0кХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyЕсли уж делать позиционно независимые строки, то вместо указателя можно хранить смещение к нему относительно this

Это уже база данных.

Там в блоке данных, хранящемся на диске
записи хранятся как попало и пракитчески любой длины
и в любом количестве .
Но в блоке есть массив смещений записей от начала блока.
Глобально запись адресуется номером ( смещением) блока от начала
датафайла и индексом массиве блока.

Эта сущьсность в БД называется rowid .

Зная rowid любую запись можно достать с диска
за одну операцию чтения 2-е коственных адресации .
по этому принципу прострен индексный поиск в БД.
...
Рейтинг: 0 / 0
21 сообщений из 46, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / sizeof( strcuct {string} )?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]