Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用叮当声转储内存布局_C++_Memory_Clang++_Static Code Analysis - Fatal编程技术网

C++ 用叮当声转储内存布局

C++ 用叮当声转储内存布局,c++,memory,clang++,static-code-analysis,C++,Memory,Clang++,Static Code Analysis,Hi search寻找一种方法,用clang转储类/结构/数据类型的内存布局。 我有一个基于教程的简单应用程序 我还添加了这个函数 bool VisitFieldDecl(FieldDecl *F) { F->dump(); std::cerr << F->getQualifiedNameAsString() << " " << F->getBitWidthValue(*Context) << " " <<

Hi search寻找一种方法,用clang转储类/结构/数据类型的内存布局。 我有一个基于教程的简单应用程序

我还添加了这个函数

 bool VisitFieldDecl(FieldDecl *F)
{
  F->dump();
  std::cerr << F->getQualifiedNameAsString()  << " " << F->getBitWidthValue(*Context) << " " << std::endl;
  F->dump() ;
  std::cerr << "-----------------------------------------" << std::endl;
  return true;
}
bool VisitFieldDecl(FieldDecl*F)
{
F->dump();

std::cerr getqualifiednameastring()一种方法是在llvm/clang-3.4中使用给定
const clang::cxrecorddecl*decl
的“AST记录布局”:

const clang::ASTRecordLayout &typeLayout(decl->getASTContext().getASTRecordLayout(decl));
std::cout << "record '" << decl->getQualifiedNameAsString() << "' with " <<  typeLayout.getSize().getQuantity() << "bytes\n";

for(clang::RecordDecl::field_iterator fit = decl->field_begin(); fit != decl->field_end(); fit++) {
    const clang::QualType qualType = fit->getType().getLocalUnqualifiedType().getCanonicalType();
    size_t fieldOffset = typeLayout.getFieldOffset(fit->getFieldIndex());
    std::cout << "member '" << qualType.getAsString() << "' with " << fieldOffset/8 << " bytes offset\n";
}
输出:

record 'EXAMPLE' with 40 bytes
member 'char' with 0 bytes offset
member 'int' with 4 bytes offset
member 'long' with 8 bytes offset
member 'long long' with 16 bytes offset
member 'float' with 24 bytes offset
member 'double' with 32 bytes offset
有关详细信息,请参阅:


你为什么需要它?标准没有定义内存布局,因此你可能会走这条路,从而引发一系列新的问题。另一方面,有时你没有出路。我们有两个库,它们提供ruby绑定和(de-)序列化信息。这使用了当前的gcc xml。由于我们对此不满意,我们正在寻找替代品。您说的“标准dosn未定义…”是什么意思?它的意思是,如果您有两个相邻的数据结构(在一个数组中)编译器可能选择的填充量是任意的。每当我必须编写序列化程序时,我都会确保不强制转换,而是从串行流复制值,反之亦然。这不是任意的,有一些不明确的规则。到目前为止,我们使用的是上面提到的libs.try
struct foobar{double x;};结构foobar arr1[10];双arr2[10];
我注意到IAR在arr1到arr2上使用了不同的对齐方式。在gcc上,对齐方式是相同的。它必须在编译器中保持一致。由于您提到ruby,我怀疑您是否可以为每个类创建手工编制的序列化模式。而且无论如何,您必须使用一些编译器辅助/信息上面的代码应该除以8,因为getFieldOffset()返回值以位为单位,而不是字节。
record 'EXAMPLE' with 40 bytes
member 'char' with 0 bytes offset
member 'int' with 4 bytes offset
member 'long' with 8 bytes offset
member 'long long' with 16 bytes offset
member 'float' with 24 bytes offset
member 'double' with 32 bytes offset