最近我必须编译 Qt,并且说明明确提到我的应用程序应该使用与我编译 Qt 相同的编译器进行编译。现在我不明白其原因,想知道这是 Qt 特有的还是通用的 C++ 的东西?
由于这是一个反复出现的话题,所以我提出了一个关于它的问题。
根据AAPCS:
5.2.1.1 通用堆栈约束
- SP mod 4 = 0。堆栈必须始终与字边界对齐
5.2.1.2 公共接口的堆栈约束
- SP mod 8 = 0。堆栈必须双字对齐。
8字节对齐背后的原理是什么?
C++ 内联命名空间的基本原理是源代码和二进制兼容性(请参阅N2535中链接的 Herb Sutter 的论文),但在引入内联命名空间时,或者如果可能的话,我无法找到保持现有库的二进制兼容性的好示例。
(有关更多信息以及源兼容性的示例,请参阅此问题)
(为了解决相关问题,使用内联命名空间引入不兼容,请参阅这个问题)
如果这是我们当前的库(例如 mylib.dll),与客户端共享并且需要稳定:
struct ModelA
{
/* (...) lots of stuff */
};
struct ModelB
{
/* (...) lots of stuff */
};
Run Code Online (Sandbox Code Playgroud)
我们是否可以使用内联命名空间引入新版本的结构/类而不破坏客户端(即仅替换共享库文件(mylib.dll),无需重新编译)?
inline namespace mylib
{
inline namespace v1
{
struct ModelA
{
/* (...) lots of stuff */
};
} // end namespace v1
namespace v2
{
struct ModelA
{
/* (...) lots of stuff + newstuff */
};
} // end namespace …Run Code Online (Sandbox Code Playgroud) 我想查询一个公钥的 eth 余额和所有代币余额。到目前为止,我设法加载web3并调用了该getBalance方法。
现在,我想查看使用相同公钥存储的 ERC20 代币的余额?例如我想查看OMG代币余额?
到目前为止我发现每个代币合约地址都要查询:https : //ethereum.stackexchange.com/questions/15372/how-can-i-view-all-the-tokens-and-contracts-related-with- an-ethereum-address
omgContractAddress = "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07"
OmgContract = web3.eth.contract(abi)
omgContract = OmgContract.at(omgContractAddress)
someUsersAddress = "0x75087d9faa28d653750f3e4c86e7dcf6aff0a916"
omgContract.balanceOf someUsersAddress, (err, balance)-> #some owner
console.error err
console.info balance.toNumber()
Run Code Online (Sandbox Code Playgroud)
问题:
1) 我需要abi每个令牌的 吗?或者我可以使用标准化abi的 ERC20 代币,只要我只想使用标准化的方法吗?
2)我在哪里可以找到abi?还是我需要重新编译每个合同?
例如 OMG:https : //etherscan.io/token/OmiseGo
考虑以下 C 代码:
#include <stdint.h>
void func(void) {
uint32_t var = 0;
return;
}
Run Code Online (Sandbox Code Playgroud)
-O0GCC 4.7.2 为上述代码生成的未优化(即:选项)汇编代码是:
func:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $0, -4(%ebp)
nop
leave
ret
Run Code Online (Sandbox Code Playgroud)
根据堆栈对准要求所述的系统V ABI,堆栈必须由16个字节每之前对准call指令(该堆栈边界是默认的16个字节时不与该选项改变-mpreferred-stack-boundary)。因此,在函数调用之前,ESP 模16的结果必须为零。
记住这些堆栈对齐要求,我假设在执行leave指令之前以下堆栈的状态表示是正确的:
Size (bytes) Stack ESP mod 16 Description
-----------------------------------------------------------------------------------
| . . . |
------------------........0 at func call
4 | return address |
------------------.......12 at func entry
4 | saved …Run Code Online (Sandbox Code Playgroud) 我无法找到在 MacOS 上编写 64 位程序集的良好文档。
64位 SysV ABI在 A.2.1 节中说了以下内容,并且此 SO 帖子引用了它:
系统调用是通过 syscall 指令完成的。内核销毁寄存器%rcx 和%r11。
从系统调用返回,寄存器 %rax 包含系统调用的结果。-4095 到 -1 之间的值表示错误,它是 -errno。
这两句话在 Linux 上没问题,但在 macOS Sierra 上却是错误的,代码如下:
global _start
extern _exit
section .text
_start:
; Align stack to 16 bytes for libc
and rsp, 0xFFFFFFFFFFFFFFF0
; Call write
mov rdx, 12 ; size
mov rsi, hello ; buf
mov edi, 1 ; fd
mov rax, 0x2000004 ; write ; replace to mov rax, 0x1 …Run Code Online (Sandbox Code Playgroud) 我的应用程序大小已达到 117 MB,因为 Play 商店不允许上传超过100 MB的 apk 。
所以我使用split并创建了多个版本的 apk,每个版本都基于不同的ABI
如果我分析universal-apk,我ABI's在 lib 文件夹中得到了这些类型;
我用它来separate apk为每个创建abi
splits {
abi {
enable true
reset()
include 'x86', 'armeabi-v7a', 'armeabi'
universalApk true
}
}
Run Code Online (Sandbox Code Playgroud)
现在我得到了 4 种类型的 apk。的universal-apk大小为117 MB,其中,如armeabi为68 MB。
所以很明显,我无法上传universal-apkon Play 商店,因此我最终会上传3 apk's游戏商店。
现在我的问题是那些用户会发生什么 cpu architecture不属于这些类别的。
我注意到 Galaxy S7 是arm64-v8a,除了这些之外,市场上还会有其他一些架构可用,所以如果这些设备universal-apk不存在,会发生什么,或者armeabi-v7a和x86有足够的目标都在市场上的设备。
这会减少目标应用程序用户吗?我无法找出 …
我正在尝试在 Solidity 合同中实现签名,但在比较哈希时遇到了问题。我使用以下代码计算哈希值:
sha256(abi.encodePacked(param1, ...., paramN);
Run Code Online (Sandbox Code Playgroud)
在哪里:
abi.encodePacked(param1, ..., paramN) = [bytes: 0x0102030405060701]
和
sha255(abi.encodePacked(param1, ..., paramN)) = [bytes32:
0x245138c905599c8579ab186fbdbd6e62396aac35a98a6568f8803eed049d1251]
我在的主要问题是,通过使用Python的SHA256 0102030405060701我得到的结果是5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5。
我究竟做错了什么?
我计划从 ABI 拆分迁移到 App Bundle 功能。目前我正在使用此代码:
def versionCodesAbi = ['x86': 1, 'x86_64': 2, 'armeabi-v7a': 3, 'arm64-v8a': 4]
splits {
abi {
enable true
reset()
include "x86", "x86_64", "armeabi-v7a", "arm64-v8a"
// "armeabi", "mips", "mips64" last three not needed and not supported currently
universalApk true
}
}
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def abi = versionCodesAbi.get(output.getFilter(OutputFile.ABI))
if (abi != null) {
output.versionCodeOverride =
abi * 1000 + variant.versionCode
}
}
}
Run Code Online (Sandbox Code Playgroud)
每个 ABI 提供 4 个 APK(+ 通用一个)。使用此代码的原因是为了减少应用程序的大小,因为PanoWidget …
我试图弄清楚如果你从函数中按值返回一个结构体,而不是返回一个指向该结构体的指针,那么在 C++ 中实际发生了什么。如果一个函数只能返回一个可以放入寄存器的值,那么在按值发送结构时如何进行通信?(我在某处读到过。)
我尝试在 Godbolt 上测试它,看看它在做什么。但我不了解大会,所以这对我有点乐观。
在我看来,在没有太多汇编知识的情况下,该函数只是更改了调用该函数之前存在的一些内存?那么return从函数中调用某些东西的概念只是一个抽象,函数只是在已经存在的内存位置设置一些字节,然后跳回到main()? 在这种情况下,根本不会复制任何内容并且返回是“免费的”?
abi ×10
assembly ×4
c++ ×3
android ×2
x86-64 ×2
arm ×1
balance ×1
blockchain ×1
c++11 ×1
ethereum ×1
gcc ×1
google-play ×1
linkage ×1
macos ×1
performance ×1
qt ×1
renderscript ×1
sha256 ×1
solidity ×1
system-calls ×1
web3js ×1
x86 ×1