标签: memory-layout

可变大小的类 - C++

我见过一个类,它是一个像这样定义的类.

class StringChild : public StringBase
    {
public:
    //some non-virtual functions
    static StringChild* CreateMe(int size);
private:
    unsigned char iBuf[1];
    };
Run Code Online (Sandbox Code Playgroud)

静态工厂函数具有以下实现..

return new(malloc(__builtin_offsetof(StringChild ,iBuf[size]))) StringChild();
Run Code Online (Sandbox Code Playgroud)

所以据我所知,这个函数使用placement new来扩展这个类.

这是安全的,因为只有一个成员,它在堆上分配?

c++ placement-new memory-layout

1
推荐指数
1
解决办法
2034
查看次数

C#结构中的成员顺序不正确

我有一个TCP客户端,它将数据包放在一个结构中

using System.Runtime.InteropServices;

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct tPacket_5000_E
{
    public Int16 size;
    public Int16 opcode;
    public byte securityCount;
    public byte securityCRC;
    public byte flag;
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.I1)]
    public byte[] blowfish;
    public UInt32 seedCount;
    public UInt32 seedCRC;
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 5, ArraySubType = UnmanagedType.I1)]
    public UInt32[] seedsecurity;
}
Run Code Online (Sandbox Code Playgroud)

我用来将数据包放入结构中的代码是:

tPacket_5000_E packet = new tPacket_5000_E();
GCHandle pin = GCHandle.Alloc(data, GCHandleType.Pinned);
packet = (tPacket_5000_E)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(tPacket_5000_E));
pin.Free();
Run Code Online (Sandbox Code Playgroud)

现在,在我继续之前,我必须告诉你我正在将这个项目从C++转换为C#.

这就是问题:

tPacket_5000_E的最后3个成员是Int32(我也尝试过UInt32),这是C++中的DWORD.这三个成员之前的值( Int32)与C++中的值相同.(我在C++和C#项目中都注入相同的数据包).

但是,这三个成员有不同的价值观.

在C++中,值是(正确的):

  1. seedCount:0x00000079
  2. seedCRC:0X000000D1
  3. SeedSecurity:
  4. - [0]:0x548ac099 …

c# struct memory-layout

1
推荐指数
1
解决办法
1705
查看次数

内核空间是否映射到Linux x86上的用户空间?

似乎在Windows 32位上,内核将从完全4G用户虚拟内存空间中保留1G虚拟内存,并将一些内核空间映射到此1G空间.

所以我的问题是:

  1. 在32位Linux上是否有类似的情况?
  2. 如果是这样,我们怎样才能看到整个内存布局?

我认为

cat /proc/pid/map
Run Code Online (Sandbox Code Playgroud)

只能看到某些进程的用户空间布局..

谢谢!

linux memory memory-layout linux-kernel windows-kernel

1
推荐指数
2
解决办法
1457
查看次数

为什么具有虚函数的类与没有的类对齐?

理查德鲍威尔的这次cppcon谈话的启发,我创建了以下代码片段来愚弄:

#include <iostream>
using std::cout;
using std::endl;

struct erdos
{
  void who()
  {
    cout << "erdos" << endl;
  }
  float f1;
  float f2;
};

struct fermat : public erdos
{
  float f3;
};

struct fermat2 : public fermat
{
  float f4;
};

struct fermat3 : public fermat2
{
  float f5;
};

int main(void)
{
  erdos e;
  cout << "sizeof(e)" << sizeof(e) << endl;
  fermat f;
  cout << "sizeof(f)" << sizeof(f) << endl;
  fermat2 f2;
  cout << …
Run Code Online (Sandbox Code Playgroud)

c++ virtual-functions memory-alignment memory-layout vptr

1
推荐指数
1
解决办法
463
查看次数

"数组"元素值是存储在一个位置还是存储在不同的位置?

由于C语言中没有数组这样的东西,以下是否都存储在一个内存位置,或者每个元素的值存储在内存位置的"数组"中?

int array[] = {11, 13, 17, 19};
Run Code Online (Sandbox Code Playgroud)

哪一个是有效的内存布局?

c arrays pointers memory-layout

0
推荐指数
1
解决办法
2210
查看次数

为什么两个指针之间的差异不等于类型的大小?

我有简单的程序:

#include <iostream>

using namespace std;


int main()
{
    int a = 5;
    int b = 6;
    int* p1 = &a;
    int* p2 = &b;
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;

    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

00DBF9B8 00DBF9AC ,sizeof(int)=4
Run Code Online (Sandbox Code Playgroud)

但是,00DBF9B8 - 00DBF9AC == ?.我无法理解这个结果.

如果我像这样修改程序:

#include <iostream>

using namespace std;


int main()
{
    static int a = 5;
    static int b = 6;
    int* p1 = &a;
    int* p2 …
Run Code Online (Sandbox Code Playgroud)

c++ memory pointers memory-layout visual-studio-2015

0
推荐指数
1
解决办法
128
查看次数

传递给函数的变量是否存储在连续的内存位置?

我写了这个小函数:

int mayor(int n1, int n2, int n3, int n4, int n5) {

   int mayor = n1;

   for(int *p=&n2; p<=&n5; ++p)

           mayor = *p;

   return mayor;

}
Run Code Online (Sandbox Code Playgroud)

能够保证所有包含该内存块n1n5是连续的?既然我得到了预期的回报值,我希望如此,但我想知道这是否安全.

c parameter-passing calling-convention memory-layout contiguous

0
推荐指数
1
解决办法
109
查看次数