我在C中有一个2张量,看起来像:
int n =4;
int l =5;
int p =6;
int q=2;
然后我初始化T的每个元素
//loop over each of the above indices
T[n][l][p][q]=...
但是,其中许多都是零,并且存在诸如这样的对称性。
T[4][3][2][1]=-T[3][4][2][1]
NULL
的东西,以便它们使用0而不是8个字节。另外,在计算的稍后部分,我可以通过检查它们是否等于NULL
编辑:对称性可以通过其他实现方式解决。但是零呢?有什么实现方法可以避免浪费内存吗?
答案 0 :(得分:1)
您不能通过写入变量的值来影响任何变量的大小。
如果要节省内存,则不仅要不使用它,还不必使用它定义变量。
如果不定义变量,则不必使用它。
这样就保存了内存。
这当然是显而易见的。
现在,如何将其应用于您的问题。
首先,请允许我简化一下,因为您没有提供足够的信息和解释,至少不能让我理解每个细节。另外,为了使说明简单。
因此,希望我能为您解决以下问题就足够了,我认为这是您问题的小弟弟。
我在C中有一个大型数组(不是很大,可以说N个条目,N == 20)。
但是出于特殊原因,我永远不需要真正读写偶数索引,它们应该像包含0一样工作,但是我想保存它们使用的内存。
所以实际上我只想使用M个条目,其中M * 2 == N。
所以不是
int Array[N]; /* all the theoretical elements */
我定义
int Array[M]; /* only the actually used elements */
当然,我无法访问不需要的任何元素,并且实际上不是必需的。
但是出于我程序的逻辑,我希望能够像访问它们一样进行编程,但是请确保它们始终始终仅读取0并忽略任何写入的值。
所以我要做的是包装对数组的所有访问。
int GetArray(int index)
{
if (index & 1)
{
/* odd, I need to really access the array,
but at a calculated index */
return Array[index/2];
} else
{
/* even, always 0 */
return 0;
}
}
void SetArray(int index, int value)
{
if (index & 1)
{
/* odd, I need to really access the array,
but at a calculated index */ */
Array[index/2] = value;
} else
{
/* even, no need to store anything, stays always "0" */
}
}
因此,我可以像数组的两倍大一样进行读写,但要保证永远不要使用伪造的元素。
并通过将索引映射为
Actualindex = wantindex / 2
我确保我访问的空间不会超出实际存在的数组的大小。
现在将这个概念移植到您描述的更复杂的设置中是您的工作。您了解所有细节,可以测试一切是否正常。
我建议通过检查结果索引来扩展GetArray()和SetArray(),以确保它永远不在实际数组之外。
您还可以添加各种自我检查,以验证是否满足所有规则和期望。