我目前在代码中使用一些显式数组定义,如下所示:
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文件可能会有所帮助,然后你需要使用一个函数或外部变量来访问它。