Здравствуйте, Carc, Вы писали:
C>Может все-так адрес взять элемента массива? C>(unsigned short*)(& data[2]) = 65535;
Этого мало — нужно ещё и разыменовать:
*(unsigned short*)(&data[2]) = 65535;
А также не забыть, что вся эта конструкция легко может навернуться из-за невыровненной записи (в зависимости от архитектуры). И нужно либо самому следить за этим (где, например, alignas в декларации массива?), либо использовать единственный кросплатформенный в C/C++ способ записи в произвольное место в памяти — функцию memcpy.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>·>А проще нельзя? BZ>·>data[2] = 255; BZ>·>data[3] = 255;
BZ>но это же займёт целых два такта! как можно в форуме C++ такое святотатство предлагать...
Тогда можно переписать как
data[2] = 255; data[3] = 255;
чтобы оно распараллелиось.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: как записать в массив char элемент размерности short ?
Здравствуйте, HAXT, Вы писали:
HAX> а мне нужно этой операцией перезаписать 2 байта в этом массиве, 2, и 3 по индексу с нуля
А проще нельзя?
data[2] = 255
data[3] = 255
Здравствуйте, Mr.Delphist, Вы писали:
BZ>>>но это же займёт целых два такта! как можно в форуме C++ такое святотатство предлагать... MD>·>Тогда можно переписать как MD>·>data[2] = 255; data[3] = 255; MD>·>чтобы оно распараллелиось. MD>Вы троллите, или в самом деле полагаете, что работу с двумя соседними байтами планировщик отдаст двум ядрам, а затем доблестно будет бороться с рассинхронизацией ядерных кэшей?
Записано же в одну строчку, значит, распараллелится
как записать в массив char элемент размерности short ?
Здравствуйте, HAXT, Вы писали:
HAX>Помогайте коллеги,
HAX>есть массив элементов char
HAX>unsigned char data[255]; (255 по 1 байту каждый)
HAX>нужно начиная с третьего его элемента записать значение unsigned short (2 байта)
На всякий случай позанудствую про endianness: какой байт надо первым класть, старший или младший?
Re[4]: как записать в массив char элемент размерности short ?
Здравствуйте, Erop, Вы писали:
BZ>>а вот от архитектуры — нет
E>Прикинь, бывают архитектуры, где быстрого доступа к полуслову вообще нет. Тока к 32 или там 64-битному слову и к байтам. E>А бывали, что и к байтам нет, тока к 48-битным словам и всё, например...
E>Так что от архитектуры по скока зараз писать выгоднее ещё как зависит...
Только после того, как копистартер покажет результаты профайлера, указывающие на проблемы производительности в этом участке кода — будем думать как писать выгоднее. А пока — пусть пишет как проще и понятнее, фтопку магию преобразований типов ссылок указателей на элементы массива.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: как записать в массив char элемент размерности short
C>>Может все-так адрес взять элемента массива? C>>(unsigned short*)(& data[2]) = 65535;
HAX>(unsigned short*)(&data[2]) = 65535; HAX>результат тот же самый
HAX>Error 1 error C2440: '=' : cannot convert from 'int' to 'unsigned short *' HAX> 2 IntelliSense: expression must be a modifiable lvalue
Ясен перец, потом что rvalue должно быть того же типа, а не int.
(unsigned short*)(&data[2]) =(unsigned short)65535;//к типу то приведи!!!
Здравствуйте, BulatZiganshin, Вы писали:
BZ>а вот от архитектуры — нет
Прикинь, бывают архитектуры, где быстрого доступа к полуслову вообще нет. Тока к 32 или там 64-битному слову и к байтам.
А бывали, что и к байтам нет, тока к 48-битным словам и всё, например...
Так что от архитектуры по скока зараз писать выгоднее ещё как зависит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: как записать в массив char элемент размерности short ?
Здравствуйте, Erop, Вы писали:
BZ>>а вот от архитектуры — нет
E>Прикинь, бывают архитектуры, где быстрого доступа к полуслову вообще нет. Тока к 32 или там 64-битному слову и к байтам.
прочёл я тебя и подумал — как я мог такую глупость сморозить! потом проверил на какое письмо ты отвечал:
BZ>>но это же займёт целых два такта!
E>От архитектуры оч. зависит, и от оптимизатора.
а вот от архитектуры — нет
так что ты просто потерял нить рассуждений
E>А бывали, что и к байтам нет, тока к 48-битным словам и всё, например... E>Так что от архитектуры по скока зараз писать выгоднее ещё как зависит...
и сейчас такие архитектуры есть, причём прямо у тебя дома штуки 3 устройств как минимум найдётся. более того, если ТС продаст почку, то он сможет купить даже такой компьютер, где упомянутые присваивания займут 1 такт. но ты про них вряд ли слышал
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: как записать в массив char элемент размерности short ?
Здравствуйте, T4r4sB, Вы писали:
TB>Объясни, почему именно элементы по 2му и 3му индексу. Может быть, на самом деле там какая-то структура? Тогда почему бы к ней сразу не привести?
а это потенциальные проблемы с выравниванием. так что лучше такие штуки распрягать сериализацией с явным указанием выравниваний/яйцеконечности
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: как записать в массив char элемент размерности short ?
Здравствуйте, T4r4sB, Вы писали:
BZ>>а это потенциальные проблемы с выравниванием. так что лучше такие штуки распрягать сериализацией с явным указанием выравниваний/яйцеконечности
TB>Выравнивание прагмапаками делается. Индеец — специальными типами, не int16_t, а int16be.
вот на мой скромный взгляд — это неправильный подход. хотя хрен его знает почему...
Люди, я люблю вас! Будьте бдительны!!!
Re: как записать в массив char элемент размерности short ?
Здравствуйте, HAXT, Вы писали:
HAX>Помогайте коллеги,
HAX>есть массив элементов char
HAX>unsigned char data[255]; (255 по 1 байту каждый)
HAX>нужно начиная с третьего его элемента записать значение unsigned short (2 байта)
HAX>почему-то так не получается HAX>(unsigned short*)(data[2]) = 65535;
HAX>пишет expression must be a modifiable lvalue
HAX>а мне нужно этой операцией перезаписать 2 байта в этом массиве, 2, и 3 по индексу с нуля
Может все-так адрес взять элемента массива?
(unsigned short*)(& data[2]) = 65535;
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, Carc, Вы писали:
C>>Может все-так адрес взять элемента массива? C>>(unsigned short*)(& data[2]) = 65535;
W>Этого мало — нужно ещё и разыменовать:
*(unsigned short*)(&data[2]) = 65535;
W>А также не забыть, что вся эта конструкция легко может навернуться из-за невыровненной записи (в зависимости от архитектуры). И нужно либо самому следить за этим (где, например, alignas в декларации массива?), либо использовать единственный кросплатформенный в C/C++ способ записи в произвольное место в памяти — функцию memcpy.
Спасибо большущее !!!
Re[3]: как записать в массив char элемент размерности short
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, Carc, Вы писали:
C>>Может все-так адрес взять элемента массива? C>>(unsigned short*)(& data[2]) = 65535;
W>Этого мало — нужно ещё и разыменовать:
*(unsigned short*)(&data[2]) = 65535;
W>А также не забыть, что вся эта конструкция легко может навернуться из-за невыровненной записи (в зависимости от архитектуры). И нужно либо самому следить за этим (где, например, alignas в декларации массива?), либо использовать единственный кросплатформенный в C/C++ способ записи в произвольное место в памяти — функцию memcpy.
правильно ли я понимаю, что если char data[10] содержал адрес adress_1 (адрес начала массива), то в общем случае (int*)data может содержать уже другой adress_2 != adress_1? и если так, то что даже reinterpret_cast<int*>(data) не сможет исправить ситуацию?
Re[3]: как записать в массив char элемент размерности short
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, Carc, Вы писали:
C>>Может все-так адрес взять элемента массива? C>>(unsigned short*)(& data[2]) = 65535;
W>Этого мало — нужно ещё и разыменовать:
*(unsigned short*)(&data[2]) = 65535;
Ну кагбэ само собой. Просто не заметил по стартовой теме, полюбасу (ц) придется сначала адресок взять, а потом танцебубнить с приведением указателя, а не значения. А так я на lvalue сходу замкнулся.
Хотя, конечно, вы правы. По цели задачи придется еще и разыменовать.
Здравствуйте, _hum_, Вы писали:
__>правильно ли я понимаю, что если char data[10] содержал адрес adress_1 (адрес начала массива), то в общем случае (int*)data может содержать уже другой adress_2 != adress_1? и если так, то что даже reinterpret_cast<int*>(data) не сможет исправить ситуацию?
блин, читаю этот тред, а в голове всё вертится фраза "москва — город девяти вокзалов"...
Люди, я люблю вас! Будьте бдительны!!!
Re[3]: как записать в массив char элемент размерности short ?
BZ>·>А проще нельзя? BZ>·>data[2] = 255 BZ>·>data[3] = 255
BZ>но это же займёт целых два такта!
От архитектуры оч. зависит, и от оптимизатора. Но на х86 часто бывает, что смесь 1-но и 2-байтных операций с памятью стоит дорого, так как не парится...
BZ>как можно в форуме C++ такое святотатство предлагать...
И то правда...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: как записать в массив char элемент размерности short ?
Здравствуйте, ·, Вы писали:
·>Только после того, как копистартер покажет результаты профайлера, указывающие на проблемы производительности в этом участке кода — будем думать как писать выгоднее. А пока — пусть пишет как проще и понятнее, фтопку магию преобразований типов ссылок указателей на элементы массива.
+100500!
Совершенно согласен! Спор чисто теоретический характер носит. Для практических нужд, обычно достаточно просто memcpy использовать и всё...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: как записать в массив char элемент размерности short ?
Здравствуйте, ·, Вы писали:
·>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>·>А проще нельзя? BZ>>·>data[2] = 255; BZ>>·>data[3] = 255;
BZ>>но это же займёт целых два такта! как можно в форуме C++ такое святотатство предлагать... ·>Тогда можно переписать как ·>data[2] = 255; data[3] = 255; ·>чтобы оно распараллелиось.
Вы троллите, или в самом деле полагаете, что работу с двумя соседними байтами планировщик отдаст двум ядрам, а затем доблестно будет бороться с рассинхронизацией ядерных кэшей?
Re[5]: как записать в массив char элемент размерности short ?
Здравствуйте, Mr.Delphist, Вы писали:
MD>Вы троллите, или в самом деле полагаете, что работу с двумя соседними байтами планировщик отдаст двум ядрам, а затем доблестно будет бороться с рассинхронизацией ядерных кэшей?
Вы троллите, или о каком таком планировщике идёт речь??
Люди, я люблю вас! Будьте бдительны!!!
Re: как записать в массив char элемент размерности short ?
Здравствуйте, HAXT, Вы писали:
HAX>Помогайте коллеги,
HAX>есть массив элементов char
HAX>unsigned char data[255]; (255 по 1 байту каждый)
HAX>нужно начиная с третьего его элемента записать значение unsigned short (2 байта)
HAX>почему-то так не получается HAX>(unsigned short*)(data[2]) = 65535;
HAX>пишет expression must be a modifiable lvalue
HAX>а мне нужно этой операцией перезаписать 2 байта в этом массиве, 2, и 3 по индексу с нуля
Объясни, почему именно элементы по 2му и 3му индексу. Может быть, на самом деле там какая-то структура? Тогда почему бы к ней сразу не привести?
Типа
Здравствуйте, BulatZiganshin, Вы писали:
BZ>а это потенциальные проблемы с выравниванием. так что лучше такие штуки распрягать сериализацией с явным указанием выравниваний/яйцеконечности
Выравнивание прагмапаками делается. Индеец — специальными типами, не int16_t, а int16be.
Re[5]: как записать в массив char элемент размерности short ?
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, T4r4sB, Вы писали:
BZ>>>а это потенциальные проблемы с выравниванием. так что лучше такие штуки распрягать сериализацией с явным указанием выравниваний/яйцеконечности
TB>>Выравнивание прагмапаками делается. Индеец — специальными типами, не int16_t, а int16be.
BZ>вот на мой скромный взгляд — это неправильный подход. хотя хрен его знает почему...
Наверное, потому, что архитектуре проца на прагмапаки начихать.
Re[6]: как записать в массив char элемент размерности short ?
Здравствуйте, Mr.Delphist, Вы писали:
MD>Наверное, потому, что архитектуре проца на прагмапаки начихать.
Ну если проц кидает исключение при невыровненном доступе, и при этом надо работать с поганым форматом, в котором нет выравнивания, то придётся действовать другими методами, каждое поле восстанавливая побайтово.
Re: как записать в массив char элемент размерности short ?