gpt4 book ai didi

c++ - C 和 C++ 之间的内存布局兼容性

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:59 24 4
gpt4 key购买 nike

我正在构建一个使用许多函数和 structC++ 库在 C 库中定义。为了避免将任何代码移植到 C++,我将典型的条件预处理添加到 C 头文件中。例如,

//my_struct.h of the C library
#include <complex.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
double d1,d2,d3;
#ifdef __cplusplus
std::complex<double> z1,z2,z3;
std::complex<double> *pz;
#else
double complex z1,z2,z3;
double complex *pz;
#endif
int i,j,k;
} my_struct;

//Memory allocating + initialization function
my_struct *
alloc_my_struct(double);

#ifdef __cplusplus
}
#endif

执行alloc_my_struct()C 中编译。它只是通过 malloc() 分配内存并初始化 my_struct 的成员.

现在,当我在我的 C++ 代码中执行以下操作时,

#include "my_struct.h"
...
my_struct *const ms = alloc_my_struct(2.);

我注意到 *ms始终具有预期的内存布局,即任何访问,如 ms->z1评估为预期值。考虑到(如果我错了请纠正我)my_struct 的内存布局,我觉得这真的很酷在分配期间由 C 编译器决定(在我的例子中为 gcc -std=c11 ),而在访问期间由 C++ 编译器决定(在我的例子中为 g++ -std=c++11 )。

我的问题是:这种兼容性是否标准化?如果没有,有什么解决办法吗?

注意:我没有足够的知识来反对对齐、填充和其他实现定义的细节。但值得注意的是,C 编译的 GNU 科学库正在实现相同的方法(尽管它们的 struct 不涉及 C99 复数)用于 C++。另一方面,我做了足够的研究得出结论,C++11 保证 C99 double complex 之间的布局兼容性。和 std::complex<double> .

最佳答案

C 和 C++ 共享内存布局规则。在这两种语言中,结构以相同的方式放置在内存中。即使 C++ 确实想做一些不同的事情,将结构放在 extern "C"{} 中也能保证 C 布局。

但是您的代码所做的依赖于 C++ std::complex 和 C99 complex 是相同的。

所以看:

关于c++ - C 和 C++ 之间的内存布局兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32189624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com