【发布时间】:2019-08-02 18:48:34
【问题描述】:
/* my program
author/date: me/now
*/
# include <stdio.h>
# define XX 1000
# define YY 20000 /* value of 1000 is ok */
# define ZZ 6000
/* global variable declaration */
int some_variable_this;
int some_variable_that;
double data[XX][YY][ZZ];
static void some_procedure_this ( void )
{
}
static void some_procedure_that ( void )
{
}
int main ( int argc, char *argv[] )
{
}
编写一个快速的 C 程序来重新格式化一些数据。
通过gcc myprogram.c 编译时,如果我使全局data 数组太大,我会得到编译器错误:
relocation truncated to fit R_X86_64_PC32 against symbol 'some_variable_this'
relocation truncated to fit R_X86_64_PC32 against symbol 'some_variable_that'
我的目标是编写一个快速的 c 代码来重新格式化一些数据。
- 这个R_X86_64_PC32是什么意思?
- 我可以使用编译器标志来解决这个问题吗?
- 有没有更好的方法在 C 中编写此代码,同时仍保持编写代码的速度和简单性以提高人类可读性?
如果重要的话,这在 linux 中的 gcc 4.3.4 上。
【问题讨论】:
-
为什么
this和that被声明为ints 和void函数? -
请注意,
1000 * 20000 * 6000 * sizeof(double)仅比 1 TiB 主内存少一点点。对于数组来说有点大。你确定尺寸合适吗?如果你真的有一台主存为 TB 的机器,我有点嫉妒。 -
您说
1000可以,但20000不行。我认为该数组的大小是您问题的主要因素。你可以使用动态内存分配(malloc()等)来避免巨大的静态大小的数组吗? -
double (*data)[YY][ZZ] = 0定义了一个指向数组的指针(如果有多个源文件,则在头文件中声明extern double (*data)[YY][ZZ];— 这意味着(XX和)YY和ZZ将也可以在标题中定义)。在您的main()程序中,添加data = malloc(XX * YY * ZZ * sizeof(double)); if (data == 0) { …allocation failed… }以分配内存。其余使用数组的代码不需要改动一点。 -
您可能会发现使用
calloc()而不是malloc()以确保在使用前将内存清零是合适的。另请注意,即使您可以以 4 GHz 的速率将内存归零并设置每个时钟周期 8 个字节(64 位),仍然需要大约 30 秒才能将那么多内存归零。在那个阵列上没有什么会很快。
标签: c compilation relocation