将显式双数组定义编译为DLL中的二进制资源-有更好的方法吗



我目前在代码中使用一些显式数组定义,如下所示:

double * p = new double[5]{
0.029426,   0.029366,   0.029281,   0.029157,   0.028979
};

但是具有更大的阵列尺寸。我这样做的原因是,因为我以ASCII文本形式获取数据,并希望能够将其作为二进制数据直接添加到创建的DLL中。编译前交换文本是自动的,但我希望避免额外的编译前步骤。

现在我注意到两件事:

a( 对于较大的数组,编译此代码变得非常缓慢

b( 得到的DLL比数组的二进制数据大小应该是大得多

c( 如果我将double更改为float,这并不会真正改变DLL大小

所有这些都让我怀疑是否没有更好的方法来做这件事,但到目前为止,我还没有在so上找到对我有帮助的答案,尽管我看到了一些相关的问题。

有人能解释我为什么看到b(和c(吗

有人能提出一个更好的方法,将(浮点/双精度(数据作为ASCII,并将其作为二进制嵌入DLL中,但不需要预编译步骤吗

也欢迎其他提示或建议。

检查汇编程序输出时,使用new似乎有很大的开销。

使用您的示例,我们可以获得类似组装的结果。

double * p = new double[5]{
0.029426,   0.029366,   0.029281,   0.029157,   0.028979
};

产生

p:
.zero   8
__static_initialization_and_destruction_0(int, int):
push    rbp
mov     rbp, rsp
sub     rsp, 16
mov     DWORD PTR [rbp-4], edi
mov     DWORD PTR [rbp-8], esi
cmp     DWORD PTR [rbp-4], 1
jne     .L3
cmp     DWORD PTR [rbp-8], 65535
jne     .L3
mov     edi, 40
call    operator new[](unsigned long)
mov     rdx, rax
mov     rax, rdx
movsd   xmm0, QWORD PTR .LC0[rip]
movsd   QWORD PTR [rax], xmm0
add     rax, 8
movsd   xmm0, QWORD PTR .LC1[rip]
movsd   QWORD PTR [rax], xmm0
add     rax, 8
movsd   xmm0, QWORD PTR .LC2[rip]
movsd   QWORD PTR [rax], xmm0
add     rax, 8
movsd   xmm0, QWORD PTR .LC3[rip]
movsd   QWORD PTR [rax], xmm0
add     rax, 8
movsd   xmm0, QWORD PTR .LC4[rip]
movsd   QWORD PTR [rax], xmm0
mov     QWORD PTR p[rip], rdx
.L3:
nop
leave
ret
_GLOBAL__sub_I_p:
push    rbp
mov     rbp, rsp
mov     esi, 65535
mov     edi, 1
call    __static_initialization_and_destruction_0(int, int)
pop     rbp
ret
.LC0:
.long   1855700750
.long   1067327961
.LC1:
.long   -428534657
.long   1067323934
.LC2:
.long   -1517051168
.long   1067318230
.LC3:
.long   634143331
.long   1067309909
.LC4:
.long   -988460953
.long   1067297963

然而,当不使用new时,编译器只能将所有内容保存为原始数据:

const double p[] = {
0.029426,   0.029366,   0.029281,   0.029157,   0.028979
};

产生类似的东西

.file   "example.cpp"
.intel_syntax noprefix
.text
.Ltext0:
.section        .rodata
.align 32
.type   p, @object
.size   p, 40
p:
.long   1855700750
.long   1067327961
.long   -428534657
.long   1067323934
.long   -1517051168
.long   1067318230
.long   634143331
.long   1067309909
.long   -988460953
.long   1067297963
.text

编辑:(赞扬似乎是一个解决方案(如果你把它放在一个头文件中,数据可能会在库中多次结束,在这种情况下,把它放进cpp文件可能会有所帮助,然后你需要使用一个函数或外部变量来访问它。

最新更新