C++对象所有属性(包括指针属性)内存连续分配*

#include <string.h>

#include <iostream>

using namespace std;

struct TestStruct {
    char *a{nullptr};
    char *b{nullptr};
    char *c{nullptr};
    int id;
};

int main(int argc, const char *argv[]) {
    // sizeof(TestStruct): 实际长度为:3个指针占有的长度 + 一个int的字节数=28,但是输出值为32,因为对齐规则有一条:
    // "结构总尺寸也要对齐. 要为最大尺寸的成员的整数倍",所以结果为32
    cout << "TestStruct sizeof: " << sizeof(TestStruct) << endl;
    cout << endl;

    int size = sizeof(TestStruct) + 6 + 3 + 2;
    auto st = (TestStruct *)malloc(size);
    st->id = 100;

    // reinterpret_cast<char *>(st) + sizeof(TestStruct)的逻辑容易错误的写成:st + sizeof(TestStruct)
    char *d = reinterpret_cast<char *>(reinterpret_cast<char *>(st) + sizeof(TestStruct));
    const char *c = "qiumc";
    memcpy(d, c, 6);
    st->a = d;

    c = "11";
    d = reinterpret_cast<char *>(reinterpret_cast<char *>(st) + sizeof(TestStruct) + 6);
    memcpy(d, c, 3);
    st->b = d;

    c = "x";
    d = reinterpret_cast<char *>(reinterpret_cast<char *>(st) + sizeof(TestStruct) + 6 + 3);
    memcpy(d, c, 2);
    st->c = d;

    cout << st->a << endl;
    cout << st->b << endl;
    cout << st->c << endl;
    cout << st->id << endl;
}
 
内存分析如下:这样可以使得结构体的所有属性都在同一段内存中连续分配(1~8, 包括结构体本身,内存连续分配)
 
 
posted @   邱明成  阅读(273)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2019-10-20 将服务器时间类型改为UTC(0000)
2019-10-20 Chrome 手动安装.crx插件
2015-10-20 ThreadLocal 在web环境下使用的边界问题
点击右上角即可分享
微信分享提示