Forwarded from dnaugsuz
KN 不是基于 JVM 的,对于 executable 它翻译到 LLVM 表示后就直接发射机器码了,但是你可以注意到 KN 也提供 GC
KN 远比 JVM 上的 Kotlin 提供的底层控制多,比如它好像还可以给本地栈指定什么参数?
runtime/src/main/cpp/Memory.h
111: 00000000002288c0 5 FUNC GLOBAL DEFAULT 15 Kotlin_createRuntime
(注意这不是 java.lang.Runtime)
我上次写的没有用到动态内存管理,但是 KN 是有 runtime 的,它不像 Rust 的 runtime 很小,而且甚至可以去掉,毕竟是要和 JVM/JS 版兼容的
KN 远比 JVM 上的 Kotlin 提供的底层控制多,比如它好像还可以给本地栈指定什么参数?
runtime/src/main/cpp/Memory.h
readelf -s ./build/bin/linuxX64/releaseExecutable/secure-desktop.kexe|grep Kotlin102: 00000000002289b0 146 FUNC GLOBAL DEFAULT 15 Kotlin_destroyRuntime
111: 00000000002288c0 5 FUNC GLOBAL DEFAULT 15 Kotlin_createRuntime
(注意这不是 java.lang.Runtime)
我上次写的没有用到动态内存管理,但是 KN 是有 runtime 的,它不像 Rust 的 runtime 很小,而且甚至可以去掉,毕竟是要和 JVM/JS 版兼容的
GitHub
JetBrains/kotlin-native
Kotlin/Native infrastructure. Contribute to JetBrains/kotlin-native development by creating an account on GitHub.
Forwarded from Richard Yu
因为不是C/C++,谁知道有没有指针?没的话那就传个0吧。C++我会写nullptr。
Forwarded from dnaugsuz
如果没有指针类型的话也是可能的,但是,如果是我也会搞个全局的常量
如果类型系统菜,程序员负责给它洗地
nullptr, 尽可能避免混淆如果类型系统菜,程序员负责给它洗地
Forwarded from dnaugsuz
是啊,所以我说是一个常量
const char *EMPTY_CHARP = "";
这里我没有指定具体分配位置,但它是常量,换句话说编译器喜欢内联也可以直接翻译成GetModuleHandle("");
或者const static char EMPTY_CHARP[] = {'\0'};
然后 GetModuleHandle(EMPTY_CHARP);
Forwarded from dnaugsuz
printf(EMPTY_CHARP); 的 x86 翻译结果是mov rdi, qword ptr [EMPTY_CHARP]
mov dword ptr [rbp - 4], eax # 4-byte Spill
mov al, 0
call printf
xor ecx, ecx
mov dword ptr [rbp - 8], eax # 4-byte Spill
上面一句 printf(""); 是movabs rdi, offset .L.str
mov al, 0
call printf
似乎和 printf(0); 是有区别的mov al, 0
call printfForwarded from Richard Yu
我说的是 GetModuleHandle 的情况啊,上面的情况是要传0进去。
Forwarded from dnaugsuz
😵 那我就完全糊涂了... 总之我上面的情况你支持吧?
之前的 GetModuleHandle 的处理,反正我不是 Win32 的程序员,算了吧
之前的 GetModuleHandle 的处理,反正我不是 Win32 的程序员,算了吧
Forwarded from dnaugsuz
也没有,你想想
上面那条
你用 x86 作为目标机器再编译一遍就会发现都是用机器栈传参数的
sizeof(char *) 是 4上面那条
call printf 指令是跳转子程序mov dword ptr [rbp - 4], eax
你知道这是赋值第二个参数(vararg)就可以了,前面 eax 的值肯定是 0 (xor eax, eax)mov rdi, qword ptr [EMPTY_CHARP]
使用 rdi 寄存器传递是因为这是 x86_64 (long mode 支持)你用 x86 作为目标机器再编译一遍就会发现都是用机器栈传参数的
Forwarded from dnaugsuz
我之前是说有人觉得
等等我理解你的意思了,原来
"" 不优雅的情况,就不用 nullptr 替换了....等等我理解你的意思了,原来
nullptr 的确和 "" 是不一样的... 但我之前没有说他们一样啊...Forwarded from dnaugsuz
GetModuleHandle 不是正常情况使用非 NULL char* 调用嘛
我之前一直是以这个前提发的消息,没有考虑输入 NULL 的情况
我之前一直是以这个前提发的消息,没有考虑输入 NULL 的情况
Forwarded from dnaugsuz
也就是说
NULL 和 "" 都支持?procedure GetModuleHandle(char *modname)
match args
[NULL] -> return GetModuleHandle("")
otherwise -> return RealGetModuleHandle(args)