[英]C++ : I have two array where the first and last element have the same memory adress
[英]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.