嵌入式科普(26)为什么heap通常8字节对齐

目录

一、概述

二、newlibc heap

2.1 stm32cubeide .ld heap

2.2 e2studio .ld heap

三、glibc源码

3.1 Ubuntu c heap

四、总结


一、概述

  • 结论:在嵌入式c语言中,heap通常8字节对齐

  • 本文主要分析这个问题的分析过程

二、newlibc heap

newlibc:
https://github.com/blueskycoco/newlibc/tree/master/newlib/libc

图片

2.1 stm32cubeide .ld heap

stm32 .ld

  /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */._user_heap_stack :{. = ALIGN(8);PROVIDE ( end = . );PROVIDE ( _end = . );. = . + _Min_Heap_Size;. = . + _Min_Stack_Size;. = ALIGN(8);} >RAM

2.2 e2studio .ld heap

ra6m3

    .heap (NOLOAD):{. = ALIGN(8);__HeapBase = .;/* Place the STD heap here. */KEEP(*(.heap))__HeapLimit = .;} > RAM
/* real_size is the size we actually have to allocate, allowing foroverhead and alignment.  */
#define REAL_SIZE(sz) \((sz) < sizeof (struct freelist_entry) - sizeof (size_t) \? sizeof (struct freelist_entry) \: sz + sizeof (size_t) + M_ALIGN(sz, sizeof (size_t)))

三、glibc源码

glibc:
https://github.com/bminor/glibc/tree/master

图片

/* MALLOC_ALIGNMENT is the minimum alignment for malloc'ed chunks.  Itmust be a power of two at least 2 * SIZE_SZ, even on machines forwhich smaller alignments would suffice. It may be defined as largerthan this though. Note however that code and data structures areoptimized for the case of 8-byte alignment.  */
#define MALLOC_ALIGNMENT (2 * SIZE_SZ < __alignof__ (long double) \? __alignof__ (long double) : 2 * SIZE_SZ)

3.1 Ubuntu c heap

Ubuntu:

图片

#include <stdio.h>  
#include <stdlib.h>  
#include <stdint.h> int main() {  // 不同大小的请求,包括不是8的倍数  size_t sizes[] = {15, 16, 23, 24, 31, 32, 64, 127, 128, 255, 256, 1023, 1024};   size_t num_sizes = sizeof(sizes) / sizeof(sizes[0]);  for (size_t i = 0; i < num_sizes; i++) {  void *ptr = malloc(sizes[i]);  // 检查 malloc 是否成功  if (ptr == NULL) {  perror("malloc failed");  return EXIT_FAILURE;  }  // 获取指针的地址  uintptr_t addr = (uintptr_t)ptr;  // 检查地址是否是8字节对齐  if (addr % 8 == 0) {  printf("Pointer for size %zu is 8-byte aligned: %p\n", sizes[i], ptr);  } else {  printf("Pointer for size %zu is NOT 8-byte aligned: %p\n", sizes[i], ptr);  }  // 释放分配的内存  free(ptr);  }  return EXIT_SUCCESS;  
} 
jerry@jerry-virtual-machine:~/桌面$ ./check
Pointer for size 15 is 8-byte aligned: 0x5615aab2d2a0
Pointer for size 16 is 8-byte aligned: 0x5615aab2d2a0
Pointer for size 23 is 8-byte aligned: 0x5615aab2d2a0
Pointer for size 24 is 8-byte aligned: 0x5615aab2d2a0
Pointer for size 31 is 8-byte aligned: 0x5615aab2d6d0
Pointer for size 32 is 8-byte aligned: 0x5615aab2d6d0
Pointer for size 64 is 8-byte aligned: 0x5615aab2d700
Pointer for size 127 is 8-byte aligned: 0x5615aab2d750
Pointer for size 128 is 8-byte aligned: 0x5615aab2d750
Pointer for size 255 is 8-byte aligned: 0x5615aab2d7e0
Pointer for size 256 is 8-byte aligned: 0x5615aab2d7e0
Pointer for size 1023 is 8-byte aligned: 0x5615aab2d8f0
Pointer for size 1024 is 8-byte aligned: 0x5615aab2d8f0
jerry@jerry-virtual-machine:~/桌面$ uname -m
x86_64cat /usr/lib/x86_64-linux-gnu/ldscripts/elf32_x86_64.x 

四、总结

  • 不论是在STM32的32位微控制器上还是在64位的Ubuntu系统中,heap 8字节对齐都因其带来的性能优化、硬件兼容性和代码可移植性而成为一种广泛接受的标准。这种做法帮助开发者构建既高效又可靠的应用程序,符合现代计算环境的需求

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM调优,参数在哪里设置的?

JVM调优&#xff0c;参数在哪里设置的&#xff1f; 在Java应用程序中&#xff0c;JVM&#xff08;Java Virtual Machine&#xff09;的调优通常通过设置JVM启动参数来实现。这些参数可以控制JVM的内存分配、垃圾回收策略、线程管理、性能优化等方面。 1. JVM参数的位置 JVM参…

nginx学习之路-nginx配置https服务器

文章目录 1. 生成证书2. 配置证书1. 拷贝证书文件2. 修改conf/nginx.conf文件内容 3. 查看效果1. 重载配置2. 访问 1. 生成证书 在linux系统下执行&#xff0c;使用openssl命令。&#xff08;windows环境也可以使用cmder&#xff09; # 1. 生成私钥 server2025.key(无密码保护…

VulnHub—potato-suncs

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 hydr…

【AI部署】腾讯云每月1w小时免费GPU获取

一、如何进入活动页面 进入腾讯云官网&#xff0c;点击控制台&#xff1a; https://curl.qcloud.com/zl1rLuMf 点击工具&#xff0c;进入CloudStudio&#xff1a; 找到高性能工作空间&#xff0c;每月会有1w分钟的免费时长&#xff1a; 二、创建AI模版 点击直接创建 选择…

使用 `llama_index` 构建智能问答系统:多种文档切片方法的评估

使用 llama_index 构建智能问答系统&#xff1a;多种文档切片方法的评估 代码优化与解析1. **代码结构优化**2. **日志管理**3. **环境变量管理**4. **模型初始化**5. **提示模板更新**6. **问答函数优化**7. **索引构建与查询引擎**8. **节点解析器测试** 总结 在现代自然语言…

开源平台Kubernetes的优势是什么?

Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统&#xff0c;其服务、支持和工具的使用范围广泛。 Kubernetes 这个名字源于希腊语&#xff0c;意…

INT305 Machine Learning

W1 Introduction Nearest Neighbor Preliminaries and Nearest Neighbor Methods • Suppose we’re given a novel input vector &#x1d465; we’d like to classify. • The idea: find the nearest input vector to &#x1d465; in the training set and copy …

如何存储和分析爬取的数据

在数据爬取过程中&#xff0c;存储和分析数据是至关重要的环节。正确的存储方式可以确保数据的安全性和可访问性&#xff0c;而有效的数据分析则可以提取出有价值的信息。以下是关于如何存储和分析爬取数据的详细介绍&#xff0c;包括具体的代码示例。 数据存储 存储爬取的数…

2025_0105_生活记录

3号去内蒙看了流星雨。还记得上次看流星的时间是2018年&#xff0c;也是冬天&#xff0c;大家在雁栖湖校区的操场上仰望星空。那个时候幸运的看到了一颗流星&#xff0c;便迅速地在心里许愿。这次看到了三颗流星&#xff0c;我也许了愿&#xff0c;希望实现。 24年走过了十多个…

Docker安装Prometheus和Grafana

概念简述 安装prometheus 第一步&#xff1a;确保安装有docker 第二步&#xff1a;拉取镜像 第三步&#xff1a;准备相关挂载目录及文件 第四步&#xff1a;启动容器 第五步&#xff1a;访问测试 安装grafana 第一步&#xff1a;确保安装有docker 第二步&#xff1a;拉…

详解GPT-信息抽取任务 (GPT-3 FAMILY LARGE LANGUAGE MODELS)

GPT-3 FAMILY LARGE LANGUAGE MODELS Information Extraction 自然语言处理信息提取任务&#xff08;NLP-IE&#xff09;&#xff1a;从非结构化文本数据中提取结构化数据&#xff0c;例如提取实体、关系和事件 [164]。将非结构化文本数据转换为结构化数据可以实现高效的数据处…

通过blob请求后端导出文件

后端controller PostMapping("/exportPlanProject2")public void exportActive(RequestBody USER user, HttpServletResponse httpServletResponse) throws IOException {}后端service public void exportExcel2(HttpServletResponse response) throws IOException {…

【跨域】解决SpringBoot和openresty跨域问题

平时后端只需要写一个配置类就可以解决跨域但是最近的新项目死活不行 先说结论 项目中的权限校验(也可以是其他的)拦截器优先级高于跨域拦截器导致跨域处理失效 解决办法 1.在addCorsMappings上增加 Order(value -100)// 跨域优先级最高 2.nginx放行OPTIONS请求 SpringBo…

数据结构9.3 - 文件基础(C++)

目录 1 打开文件字符读写关闭文件 上图源自&#xff1a;https://blog.csdn.net/LG1259156776/article/details/47035583 1 打开文件 法 1法 2ofstream file(path);ofstream file;file.open(path); #include<bits/stdc.h> using namespace std;int main() {char path[]…

k8s基础(3)—Kubernetes-Deployment

一、 Deployment概述 ‌ Kubernetes Deployment‌是Kubernetes中的一个核心概念&#xff0c;它是一种高级别的控制器&#xff0c;用于管理Pod和ReplicaSet&#xff0c;确保应用程序的高可用性和稳定性。Deployment通过声明式配置来创建和更新Pod和ReplicaSet&#xff0c;从而…

JS获取URL中参数值的4种方法

方法1&#xff1a;现代浏览器都支持 URL 和 URLSearchParams 对象&#xff0c;可以很方便地从URL中提取参数 // 假设当前URL为 "https://example.com/?nameJohn&age30" const url new URL(window.location.href); // 或者你可以直接传入一个URL字符串 const n…

ubuntu开启root用户

Ubuntu 启用 root 账户 在 Ubuntu 中&#xff0c;默认情况下 root 账户是被禁用的。为了启用 root 账户&#xff0c;你需要设置 root 用户的密码。以下是如何在 Ubuntu 上启用 root 账户的步骤&#xff1a; 打开终端。 输入以下命令来设置 root 用户的密码&#xff1a; sud…

C#跨窗口传递Halcon图像/参数

Demo目的&#xff0c;图像同步到附属窗口&#xff0c;通过附属窗口各类操作&#xff08;参数设置&#xff0c;ROI重置等&#xff09;简化主界面 本文主要演示图像传递 主界面 附属界面 运行效果 主界面代码 using System; using System.Collections.Generic; using System.C…

JavaScript 随机 数用法

在 JavaScript 中,生成随机数通常是使用 Math.random() 方法。这个方法生成一个伪随机浮点数,范围从 0(包括)到 1(不包括)。以下是一些常见的随机数用法和技巧: 1. 生成一个 [0, 1) 范围内的随机浮点数 let randomNum = Math.random(); console.log(randomNum); // 输

32单片机从入门到精通之开发环境——调试工具(七)

在人生的道路上&#xff0c;困难和挫折时常会出现。但是我们不能因此放弃&#xff0c;而是要坚持努力&#xff0c;克服困难&#xff0c;实现自己的梦想。成功不是一蹴而就的&#xff0c;它需要付出大量的努力和坚持不懈的精神。每一次的失败都是一次宝贵的经验&#xff0c;它能…