问题标签 [abi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 具有虚拟基类的类的大小
可能重复:
对象大小与虚拟
为什么 sizeof(Class) 在我的 gcc 编译器上输出 12?有人可以解释一下吗?
c++ - 默认构造函数和析构函数是否内联?
我很好奇编译器生成的默认构造函数和析构函数是否是内联的,因为无论哪种方式我都可以证明它是合理的。一方面,您希望默认构造函数/析构函数不是内联的,以便稍后添加它们不会破坏 ABI(因为在只有默认值时编译的目标文件将内联生成的定义而不是您定义的定义)。另一方面,对于 C++ 编译器来编译 C 代码的性能与使用 C 编译器编译时一样好,它不能为每个分配的结构添加构造函数/析构函数调用,而在 C++ 中,类之间的唯一功能差异并且结构应该是默认的访问保护。也许链接器以某种方式解决了这个问题?也许答案因编译器而异?
这个问题的结果:如果我在 C++ 中有一个 POD 结构,理论上我可以通过自己定义空的内联构造函数/析构函数来代替默认值,从而在某些编译器下受益吗?
c++ - C++ 和二进制兼容性:按值返回 POD 结构
考虑以下 C++ 代码:
现在假设这段代码被放在一个共享库中,供第三方应用程序使用。
X
我的问题是:如果我在(例如)末尾添加另一个成员int c
,并在 中对其进行初始化,调用中断foobar()
的现有应用程序会吗?foobar()
请注意,这是关于二进制兼容性,而不是源代码兼容性。
android - 以编程方式检索 Android ARM 处理器版本
有没有办法以编程方式检索 ARM 处理器版本?我正在尝试将其发送到 Google Analytics。我被告知它在 /proc/cpuinfo 文件夹中,但我不确定如何在代码中检索此信息。
assembly - 在 Win64 ABI 中,保留的参数堆栈空间可以用于通用存储吗?
我正在 Windows 上学习 x64 程序集以获得“乐趣”。Windows 上 x64 调用约定的MSDN 文档说:
调用者负责为被调用者分配参数空间,并且必须始终为 4 个寄存器参数分配足够的空间,即使被调用者没有那么多参数。这有助于简化支持 C 非原型函数和可变参数 C/C++ 函数。
由于我的函数不是 C 非原型函数或可变参数 C/C++ 函数,这是否意味着我总是可以使用[rsp+8]
to [rsp+32]
(假设调用后立即未修改的值rsp
)在我的函数中进行通用存储,例如局部变量?
c++ - 如果我用“goto”跳出一个捕获块,我是否保证异常对象将被释放?
我有如下代码
我的问题是,当我goto
离开 catch 块时,C++ 运行时存储的异常对象是否被释放?或者运行时是否允许缓存它,直到周围的函数存在或类似的东西?我只是想确保如果我多次执行上述代码,每次使用倒带代码时,我都不会泄漏内存(因为longjmp
不会执行编译器在函数序言中或之前发出的清理代码)。
android-ndk - Android NDK - 链接外部库的问题(找不到)
我正在使用 cygwin 下的 Android NDK r6b(系统已正确更新)。我正在修改 hello-jni 示例以学习使用 NDK。由于我有一个用 C++ 编写的库,我希望在 hello-jni 中使用(实际上,我已经创建了一个名为 helloworld 的 prj,其中包含一个名为 ndkfoo.cpp 的单个 .cpp 文件)示例,我在 Eclipse 中创建了一个新的 Android 项目(为Android更新),添加了一个jni目录,添加了一个Android.mk和Application.mk文件,编辑它们以编译.cpp。在编译结束时,我获得了一个.so文件。
现在,在 helloworld Android.mk 中,我需要进行一些编辑以告诉链接器包含该库。假设库文件是libmylib.so,我有以下 android.mk 脚本:
LOCAL_PATH := $(调用我的目录)
包括 $(CLEAR_VARS)
LOCAL_MODULE := ndkfoo
LOCAL_SRC_FILES := ndkfoo.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/mylib
LOCAL_LDLIBS += -L$(LOCAL_PATH)/../../mylib/libs/armeabi/ -lmylib
包括 $(BUILD_SHARED_LIBRARY)
我的目录按以下方式组织:
(因此,libmylib.so 的路径是:d:/android/workspace/mylib/libs/armeabi)。
不幸的是,这似乎不起作用。如果我从 ndkfoo.cpp中删除对mylib的所有引用,它甚至可以在我的手机上编译和运行。如果我不删除对mylib的引用,它会编译但不会链接:我得到以下结果:
D:/android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windo ws/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../ ../../../arm-linux-androideabi/bin/ld.exe:找不到-lmylib
附言。我忘了提到我在helloworld项目的jni目录下运行ndk-buld。附言。我在互联网上发现了很多类似的问题。我一直使用 Visual C/C++ IDE,所以我对 GCC、makefile 等真的很陌生……
c++ - 接口(抽象类)与其他虚拟更改的 ABI 兼容性
即使在派生类中进行了涉及虚拟的其他更改,类视图的 ABI 是否保持稳定?
也就是说,假设我有一个接口InterfaceA
(具有许多纯虚函数的抽象类)和一个DerivedB
从它继承的类。我编写了一个库,该库具有采用InterfaceA *
. 我想知道的是,只要接口本身不改变,接口是否保持二进制兼容。
清楚,如果我修改InterfaceA
我不希望代码是二进制兼容的。但是,如果我只是修改DerivedB
,比如说我继承更多接口或添加其他虚拟功能。在最极端的情况下,我从另一个定义InterfaceA
. 尽管有所有这些变化,是否InterfaceA
仍保持二进制兼容?
到目前为止,我的假设和经验是,是的,它是兼容的。我只是在寻找对此的确认(如果不兼容,则进行反驳)。
注意:我不关心动态类型或其他类型转换,我只关心接口函数本身。
另请注意:假设正在使用的编译器版本整体上是 ABI 稳定的——没有主要版本更改。
windows - 64 位系统的整数大小差异(与我的旧 32 位 pc 系统混淆)
几个月前,我给自己买了一台带有 cpu intel i7-2630qm 和 64 位 Windows 的笔记本电脑。在这个系统下练习我的编程技巧时,我在整数大小方面遇到了一些差异,这让我认为这可能是由于我的新 64 位系统造成的。
我们来看一段代码。
C代码:
问题:
1.) 我记得在拿到这台新笔记本电脑之前,这意味着当时我还在使用旧的 32 位系统,当我运行这段代码时,由于说明符,程序将打印整数20
,而旁边有一些随机数%lld
.
2.)但是当我使用我的新笔记本电脑时,这种现象不再发生,它会正确打印两个整数,即使我将变量更改num
为 type short
。
3.)它是在 64 位系统上,有新的整数提升,int
当它用作参数时会提升为 long long?或者当作为参数传递时它是否short
也可以提升long long
为 64 位的整数? ?
4.)除此之外,我对一件事很困惑,在 16 位系统上,int
将是 16 位,而在 32 位系统上将是 32 位。但为什么不变成 64-当它在 64 位时位?
==================================================== ================================= 插件:
1.)我在 IDE 上选择“控制台程序(64 位)”作为我的项目,同时使用我的新笔记本电脑,但在我的 32 位旧 PC 系统上选择“控制台程序”。
2.)我已经int
使用运算符检查了“控制台程序(64 位)”项目的大小sizeof
,它返回 32 位,但short
仍然保持 16 位。唯一的变化是long
类型,它是 64 位,long long
仍然保持它的通常的 64 位大小。
x86 - x86、x32 和 x64 架构之间的区别?
请解释和之间x86
的区别?它有点令人困惑,因为大多数时候 32 位程序在 x86 上运行......x32
x64
x86
x32