<p>如果您正在使用GNU工具,那么直接使用<code>objcopy</code>来实现Jean Francois建议的目标是相当容易的;结合PM2Ring的python脚本编写一个二进制数组,您可以执行:</p>
<pre><code>objcopy -I binary test.data -B i386:x86-64 -O elf64-x86-64 testdata.o
</code></pre>
<p>(根据实际的处理器体系结构,可能需要调整)。该命令将使用以下符号创建一个名为<code>testdata.o</code>的新对象:</p>
^{pr2}$
<p>在链接程序中,所有这些符号都将显示为带有C链接的符号。{{cd4}不能被转换成cd3},但不能使用cd3}。这里是一个最小的C++程序:</p>
<pre><code>#include <iostream>
extern "C" double _binary_test_data_start[];
extern "C" double _binary_test_data_end[0];
int main(void) {
double *d = _binary_test_data_start;
const double *end = _binary_test_data_end;
std::cout << (end - d) << " doubles in total" << std::endl;
while (d < end) {
std::cout << *d++ << std::endl;
}
}
</code></pre>
<p><code>_binary_test_data_end</code>实际上刚好超过数组<code>_binary_test_data_start</code>中的最后一个元素。在</p>
<p>编译并使用<code>g++ test.cc testdata.o -o program</code>(使用上面objcopy中的testdata.o)链接这个程序。在</p>
<p>输出(<code>cout</code>默认情况下似乎笨拙地截断了小数):</p>
<pre><code>% ./a.out
32 doubles in total
0
0.0625
0.125
0.1875
0.25
0.3125
0.375
0.4375
0.5
0.5625
0.625
0.6875
0.75
0.8125
0.875
0.9375
1
1.0625
1.125
1.1875
1.25
1.3125
1.375
1.4375
1.5
1.5625
1.625
1.6875
1.75
1.8125
1.875
1.9375
</code></pre>
<hr/>
<p>您也可以很容易地将这些值赋给一个向量;<code>std::vector<double></code>接受两个迭代器,其中第一个指向第一个元素,第二个指向后面的一个元素;您可以在数组衰变为指针时使用这里的数组,指针可以用作迭代器:</p>
<pre><code>std::vector<double> vec(_binary_test_data_start, _binary_test_data_end);
</code></pre>
<p>但是,对于大型数组,这只是不必要的复制。此外,仅使用C数组还有一个额外的好处,即它是<em>延迟加载的</em>;ELF可执行文件不会被读入内存,但它们会根据需要进行分页;二进制数组只有在被访问时才从文件加载到RAM中。在</p>