LINUX.ORG.RU

C++ арифметика указателей: является ли код эквивалентным?

 , ,


1

2

Первый второму?

#include <iostream>
#include <cstddef>
#include <new>

int main()
{
    alignas(float) std::byte stor[3*sizeof(float)];
    
    for (int i = 0; i < 3; ++i)
        new (stor + i*sizeof(float)) float(i);
    
    for (int i = 0; i < 3; ++i)
        std::cout << *std::launder( reinterpret_cast<float*>(stor + i*sizeof(float)) ) << std::endl;
}
#include <iostream>
#include <cstddef>

int main()
{
    alignas(float) std::byte stor[3*sizeof(float)];
    
    for (int i = 0; i < 3; ++i)
        new (stor + i*sizeof(float)) float(i);
    
    for (int i = 0; i < 3; ++i)
        std::cout << ((float*)stor)[i] << std::endl;
}


Последнее исправление: sostupid (всего исправлений: 2)

че спросить то хотели ? препод выгнал с практики за ваше не знание ?

anonymous
()
Ответ на: комментарий от anonymous

Одинаковый ассемблер не значит, что это одинаковые конструкции в C++.

Или кто-то хочет сказать, что volatile и atomic это одно и то же?

sostupid
() автор топика
Ответ на: комментарий от sostupid

атомик это вообще отдельная сущность, где вы в своем примере с массивами флоат новые сущности увидели ? у вас всего лишь адресная арифметика, я удивлен что вы еще 1[a] арифметику не притянули

anonymous
()
Ответ на: комментарий от Deleted

Если тебя и правда интересует это — создай свой тред.

sostupid
() автор топика
Ответ на: комментарий от sostupid

а можете сходить купить книжку на русском(если уже так с английским тяжело) и почитать самостоятельно ? а еще лучше закончить ВУЗ где обучат английскому и почитать стандарт самостоятельно. Он в открытом доступе. Бесплатно.

anonymous
()
Ответ на: комментарий от sostupid

А можешь каждую => подкрепить ссылками на соответствующие пункты в стандарте?

Ну, см., например, п. 3.3.2.1 из стандарта c89:

3.3.2.1 Array subscripting

Constraints

One of the expressions shall have type ``pointer to object type ," the other expression shall have integral type, and the result has type `` type ."

Semantics

A postfix expression followed by an expression in square brackets [] is a subscripted designation of a member of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*(E1+(E2))) . Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial member of an array object) and E2 is an integer, E1[E2] designates the E2 -th member of E1 (counting from zero).

aureliano15 ★★
()
Ответ на: комментарий от sostupid

Ненамного твоих познаний хватило.

Ты думаешь, что мне больше нечем заняться, чем искать цитаты в стандарте то ли для троля, то ли для полного неосилятора, который не удосужился прочитать элементарный учебник? Ссылка на стандарт у тебя есть. Если хочешь, могу подкинуть и на более новые, и на си++.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

Ты думаешь, что мне больше нечем заняться, чем искать цитаты в стандарте то ли для троля, то ли для полного неосилятора

А зачем начинал? Проблемы с самоконтролем?

sostupid
() автор топика
Ответ на: комментарий от sostupid

зачем начинал

Ну это как бы распространённая практика: подсказать направление поиска вместо выполнения всей задачи за кого-то

Deleted
()
Ответ на: комментарий от Deleted

По-моему, в данном случае имеет место быть другая распространённая практика: найти поиском по ключевым словам в файле какой-то более-менее релевантный пункт, а когда это не получается — объявить спрашивающего троллем и неосилятором.

sostupid
() автор топика
Ответ на: комментарий от sostupid

Ненамного твоих познаний хватило.

Ты тролль? Язабан. Тебе подсказали часть ответа, сказали где искать остальное, а ты грубишь и дерзишь.

Dudraug ★★★★★
()
Ответ на: комментарий от Deleted

Ещё в тему: «взялся за гуж — не говори, что не дюж».

«Сколько людей - столько и мнений» (c)
(c)

Я думал это public domain.

sostupid
() автор топика
Ответ на: комментарий от sostupid

По-вашему, вопросы задают чтобы получить в ответ «RTFM»?

Хочешь ответа - жди, или гугли, читай стандарт по тому что тебе скинули. Ты имеешь права тут ждать ответа, а тебе имеют права не отвечать, а вот требовать уже права у тебя нет.

Dudraug ★★★★★
()
Ответ на: комментарий от sostupid

public domain

Да хз. Фраза не моя, в смысле

Deleted
()
Ответ на: комментарий от Dudraug

Ты тролль?

Нет.

Язабан

«Сколько людей - столько и мнений»

сказали где искать остальное

Это был настолько размытый ответ, что это даже не ответ, а просто способ хитро уйти от него, замаскировав своё незнание.

ты грубишь и дерзишь.

Меня необоснованно обозвали троллем, хотя я не вбрасывал никакой провокационно ложной информации (это примерное определение троллинга, которое я нашёл). И вообще ложной не вбрасывал.

sostupid
() автор топика
Ответ на: комментарий от sostupid

А зачем начинал?

Начинал задавать дурацкие вопросы ты. Я тебе на один из них ответил. На остальные — ищи сам.

Если это элементарный вопрос — ну так дай простой ответ.

Тебе уже дали простой ответ:

((float*)stor)[i] => *((float*)stor + i) => *((float*)((char*)stor + i * sizeof(float)) => *(float*)(stor + i * sizeof(float))

Это знает любой новичок в си/си++, освоивший элементарный учебник. А если на каждый чих тебе нужны цитаты из стандарта, то это твоя проблема, и решай её сам. Или дай объявление в раздел jobs. Думаю, тыщ за 5, а то и меньше тебе на любую конструкцию и любой оператор приведут выдержку из стандарта.

имеет место быть другая распространённая практика: найти поиском по ключевым словам в файле какой-то более-менее релевантный пункт, а когда это не получается

Какой «более-менее»? Ты о чём? Читать умеешь? Там всё чётко и однозначно написано, а не «более-менее». И всё получается.

aureliano15 ★★
()
Ответ на: комментарий от sostupid

Так ты просишь, тебе надо. Не особо логично обзывать того у кого просишь помощи, не находишь? Мир несправедлив. Тебе никто ничего не должен.

Dudraug ★★★★★
()
Ответ на: комментарий от aureliano15

Это знает любой новичок в си/си++, освоивший элементарный учебник. А если на каждый чих тебе нужны цитаты из стандарта, то это твоя проблема, и решай её сам

Вот-вот, мне казалось, что это знают вообще все кто осилил более менее серьезный учебник по си или плюсам. Просто хочешь ответа - смотришь учебник или справочник, хочешь обоснование по стандарту - смотришь стандарт. Ну можно спросить, могут ответить, а могут и нет. Таков интернет. Но спрашивать такую элементарщину - это зашквар.

Dudraug ★★★★★
()
Ответ на: комментарий от sostupid

-O0 поставь. Сейчас бы код с разными конструкциями, который ничего не делает по асм выхлопу сравнивать...

Dudraug ★★★★★
()
Ответ на: комментарий от aureliano15

Это знает любой новичок в си/си++, освоивший элементарный учебник.

А когда новичок начинает читать неэлементарные учёбники или, лучше всего, стандарт — он осознаёт, что он ничего не знал.

Там всё чётко и однозначно написано, а не «более-менее». И всё получается.

Ок, ок. С первым переходом я полностью согласен.

sostupid
() автор топика
Ответ на: комментарий от Dudraug

Я правильно понимаю, твоя точка зрения «если у конструкций одинаковый асм-выхлоп при -O0, то это одинаковые конструкции»?

sostupid
() автор топика
Ответ на: комментарий от Dudraug

Тебе цитату из стандарта привели.

Привели.

Которая объясняет первую стрелку

Полностью согласен.

и твой изначальный вопрос

А это — не так.

sostupid
() автор топика
Ответ на: комментарий от sostupid

Нет, но приводить как контр-аргументы надо хотя бы более адекватные примеры=)

Dudraug ★★★★★
()
Ответ на: комментарий от sostupid

А это — не так.

Поясни, что в твоем вопросе осталось не понятно после цитаты из стандарта?

Dudraug ★★★★★
()
Ответ на: комментарий от sostupid

А когда новичок начинает читать неэлементарные учёбники или, лучше всего, стандарт — он осознаёт, что он ничего не знал.

Так ты не читаешь стандарт, ты просишь чтобы за тебя его прочитали.

Dudraug ★★★★★
()
Ответ на: комментарий от aureliano15

Хотя, знаете что. Я перечитал цитату и поменял своё мнение.

И всё получается.

Ничего не получается.

Читать умеешь?

Да.

Там всё чётко и однозначно написано

Не совсем чётко. Кое-что из «Semantics» я бы перенёс в «Constraints». В общем, одно предложение в разделе Semantics намекает, что что-то не в порядке.

sostupid
() автор топика
Ответ на: комментарий от Dudraug

Вот-вот, мне казалось, что это знают вообще все кто осилил более менее серьезный учебник по си или плюсам.

Мне кажется, что в любом самом несерьёзном учебнике это должно быть. Потому что это азы.

aureliano15 ★★
()
Ответ на: комментарий от sostupid

Это знает любой новичок в си/си++, освоивший элементарный учебник.

А когда новичок начинает читать неэлементарные учёбники или, лучше всего, стандарт — он осознаёт, что он ничего не знал.

Тебе уже несколько человек подтвердили, что все эти конструкции абсолютно идентичны. Так что поверь на слово. А если не хочешь, то ссылка на стандарт у тебя есть. Почему другие должны копаться в нём, чтоб найти там и без того очевидные вещи, удовлетворяя твою любознательность. Любознательность и скепсис — это хорошо, но не за счёт других.

Там всё чётко и однозначно написано

Не совсем чётко. Кое-что из «Semantics» я бы перенёс в «Constraints». В общем, одно предложение в разделе Semantics намекает, что что-то не в порядке.

Со стандартом? Ну тогда не читай его, а напиши свой.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

В любом серьёзном и несерьёзном учебнике по плюсам написано, что массивы нельзя друг другу присваивать. Да и компиляторы не компилируют код с присваиванием массивов.

А некоторое время назад один уважаемый человек (вроде даже какой-то член, и вроде даже член комитета по C++) осознал, что он не может найти в стандарте пунктов, которые бы запрещали присваиваивать один массив другому.

И, по-моему, до сих пор ему не нашли и не показали таких пунктов.

А ведь это тоже для многих «азы» и спроси я, почему не компилируется код с присваиванием массивов — я бы тоже получил в ответ струю дерьма из «ты тролль» и «ты неосилятор» как это происходит сейчас.

sostupid
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.