繁体   English   中英

定义一个C数组,其中每个元素都是相同的内存位置

[英]Defining a C array where every element is the same memory location

在C(或C ++)中,是否可以创建一个数组a (或“看起来像”数组的东西),使得a[0]a[1]等都指向相同的内存位置? 所以如果你这样做

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

那么a[0]等于1.0f ,因为它与a[1]处于相同的存储位置。

我确实有理由要这样做。 这可能不是一个好理由。 因此,请将此问题视为纯粹出于好奇而提出。

我应该说:我想做到这一点而不重载[]运算符。 这样做的原因与避免动态调度有关。 (我已经告诉过你我这样做的理由可能不是一个好理由。不必告诉我我不应该这样做。我已经知道了。)

我想你需要这样的课

template <typename T>
struct strange_array
{
   T & operator [] (int) { return value; }
private:
   T value;
};

您总是可以定义一个指向相同变量的指针数组:

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

在C语言中,我不这么认为。

表达式a[i]简单含义是*(a + i) ,因此由于索引的原因很难避免加法。

您也许能够通过使粘合起来的东西a (数组名)宏,但我不知道如何:你就不必为了弥补其访问索引。

没有重载operator[]

不,不可能。

幸好。

从这里的所有对话中,我现在了解到以下问题:

您想拥有数组的语法,例如

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

但是您希望将语义更改为所有映射到相同元素的语义,例如

a[0]
a[0]++

达到此目的的C ++方法是恕我直言,以重载索引访问运算符[]。 但是,出于性能原因,您不想要它。

我加入了Orbit用户Lightness Races的观点,您在C ++中无法做到这一点。

由于您没有提供有关用例的更多信息,因此很难提出解决方案。 我能想象的最好的是,您有许多编写的代码使用了无法更改的数组语义。

剩下的(想要保持性能)是代码转换技术(CPP,sed等),例如,通过将所有索引值强制为0,从给定的源代码生成具有所需行为的源代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM