Определение массива C, где каждый элемент находится в одной и той же ячейке памяти

0

В C (или C++) можно создать массив a (или что-то похожее на "массив"), так что a[0], a[1] и т.д. Все указывают на одну и ту же память место нахождения? Так что если вы это сделаете

a[0] = 0.0f;
a[1] += 1.0f;

то a[0] будет равно 1.0f, так как это то же место памяти, что a[1].

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

Я должен был сказать: я хочу сделать это без перегрузки оператора []. Причина этого заключается в том, чтобы избежать динамической отправки. (Я уже сказал, что моя причина для желания сделать это, вероятно, не очень хорошая. Мне не нужно говорить мне, что я не хочу этого делать. Я уже это знаю.)

  • 2
    Нет, тогда это не массив. Также было бы очень сложно понять, что происходит, возможно, даже для вас, когда вы вернетесь к этому через несколько месяцев.
  • 0
    Союз - это похожая концепция. Когда вы используете объединение, вы ссылаетесь на одну и ту же ячейку памяти с разными именами членов. Таким образом, вы можете определить членов вашего союза как 2 разных массива
Показать ещё 10 комментариев
Теги:
arrays

5 ответов

3

Я полагаю, что такой класс нужен вам

template <typename T>
struct strange_array
{
   T & operator [] (int) { return value; }
private:
   T value;
};
  • 0
    Надеюсь, каким-то образом установить value ...
  • 0
    Разве не достаточно вернуть ссылку на value ?
Показать ещё 5 комментариев
2

Вы всегда можете определить массив указателей, который указывает на одну и ту же переменную:

typedef int* special;
int i = 0;
unsigned int var = 0xdeadbeef;
special arr[5];

for (i=0; i<5; i++)
    arr[i] = &var;

*(arr[0]) = 0;
*(arr[3]) += 3;

printf("%d\n", *(arr[2]));
// -> 3
  • 0
    Я, вероятно, в конечном итоге сделаю это. Недостатком является то, что gcc никогда не сможет автоматически векторизовать мой код, но реально, вероятно, нет никакого пути к этому.
0

Из всего этого разговора я теперь понимаю проблему следующим образом:

Вы хотите иметь синтаксис массива, например

a[n]     // only lookup 
a[n]++   // lookup and write

но вы хотите, чтобы семантика изменилась на все эти карты на один и тот же элемент, например

a[0]
a[0]++

C++ способ достижения этого - IMHO, чтобы перегрузить оператор доступа к индексу []. Но вы не хотите этого по соображениям производительности.

Я присоединяюсь к мнению пользователей Lightness Races на орбите, что вы не можете сделать это в C++.

Поскольку вы не предоставляете больше информации о прецеденте, трудно найти решение. Лучше всего я могу представить, что у вас много письменного кода, который использует семантику массива, которую вы не можете изменить.

Остальные (желая сохранить производительность) - это методы трансформации кода (CPP, sed,..), генерирующие исходный код из данного исходного кода с желаемым поведением, например, путем форсирования всех значений индекса до 0.

  • 0
    Меня не интересует синтаксис, я просто хочу избежать накладных расходов. Я надеялся, что хакерский указатель C низкого уровня сделает эту работу, но, очевидно, нет. Я опубликую менее глупый вопрос о моем фактическом случае использования в курсе.
0

Без перегрузки operator[]?

Нет, это невозможно.

К счастью.

0

В C я так не думаю.

Выражение a[i] просто означает *(a + i), поэтому трудно избежать добавления из-за индексации.

Вы можете быть в состоянии склеить что - то вместе, сделав a (имя массива) макрос, но я не знаю, как вы не имели бы доступ к индексу, чтобы компенсировать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню