不同编译器下,定义一个地址按x字节对齐的数组

以前一直用MDK,用__align(4)就可以定义一个首地址被4整除、地址按4字节对齐的数组,但今天用IAR发现这么写编译报错。

搜了一下才发现,原来不同的编译器,需要用不同的表达方式:

#if defined   (__CC_ARM) /*!< ARM Compiler */ //MDK
    __align(4)
    uint16_t data[40];

#elif defined ( __ICCARM__ ) /*!< IAR Compiler */ 
    #pragma data_alignment=4 
    uint16_t data[40];

#elif defined (__GNUC__) /*!< GNU Compiler */ 
    uint16_t data[40];             __attribute__ ((aligned (4))); 

#elif defined  (__TASKING__) /*!< TASKING Compiler */ 
    __align(4) 
    uint16_t data[40];

#endif /* __CC_ARM */

 

转载于:https://www.cnblogs.com/cage666/p/10650469.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 不同数组地址不一定是连续的。在内存中,每个数组都会占用一段连续的地址空间,但是不同数组之间并没有任何关联,它们的地址可能是相邻的,也可能是分散的。这是由于操作系统和编译器的内存管理机制所决定的,具体的情况取决于操作系统和编译器的实现方式。在某些情况下,不同数组可能会被分配到不同的物理内存地址,这样它们的地址就不会是连续的。 ### 回答2: 不同数组地址不一定是连续的。在计算机内存中,数组是一段连续的存储空间,里面存储有相同类型的数据。当定义不同数组时,编译器会为每个数组分配一段存储空间,并根据数据类型和数组长度计算出每个数组的起始地址。 然而,不同数组是根据它们定义的顺序来分配内存空间的,而不是根据它们的实际使用顺序。这意味着,如果两个数组定义的顺序不同,它们的地址也可能不连续。 此外,在某些情况下,编译器可能会插入一些填充字节或对齐操作来提高存取效率。这样做可能会导致数组地址不是连续的,因为编译器为了优化内存访问而进行了空间对齐。 因此,不同数组地址不一定是连续的,它们的地址取决于数组的定义顺序以及编译器的优化策略。对于连续存储的需求,可以使用指针、动态内存分配等方式来实现。 ### 回答3: 不同数组地址不一定是连续的。在计算机内存中,数组是存储在连续的内存空间中的一系列元素。对于同一个数组而言,各个元素的地址是连续的,可以通过指针或索引来访问。 然而,不同数组在内存中可以分布在不同的位置,它们的地址不一定是连续的。这是因为计算机内存是由多个内存块组成的,每个内存块可以存储一个或多个数组。当定义多个数组时,编译器会根据需要在内存中找到合适的空间来存储这些数组。 另外,如果使用动态内存分配,不同数组可以在运行时在内存的不同位置动态分配。这是通过使用malloc()或new运算符来实现的。在这种情况下,不同数组地址一般不会是连续的。 因此,不同数组地址是否连续取决于数组的定义和内存分配方式。在一般情况下,它们的地址不是连续的,但是同一个数组地址是连续的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值