如何让GCC在ROM中放置C ++ constexpr?

时间:2012-06-11 14:37:56

标签: c++ gcc arm constexpr

我为LPC1114编译,这是一个小型ARM(实际上是Cortex)目标。 RAM比ROM更受限制。我使用最新的Mentor(CodeBenchLite)GCC编译器(GCC 4.6.3)。我有一些我希望在ROM中拥有的常量对象。据我所知,下面代码中的ffx对象应该以ROM(代码)结尾,而是放在DATA中。

class flop {
    public:
       int x;
       constexpr flop( int x ) : x(x){}
};

 extern constexpr flop ffx( 1 );

如何说服编译器预先计算对象并将其放在ROM中?

或者我应该问:

  • 我能以某种方式期望G ++编译器为ffx
  • 生成可ROMable数据
  • 如果是的话,我的代码是否正确
  • 如果是这样,支持G ++版本(我使用4.6,也许我需要4.7?)

=======================================

这个bugzilla条目c++/49673似乎表明我的已知问题,可能已在GCC 4.7中修复。不幸的是,我更喜欢使用内置的Mentor / CodeSourcery,它仍然是4.6.3。所以我想暂时我会遇到这个bug。 :(

2 个答案:

答案 0 :(得分:1)

  

更新#2:使用gcc 4.7.0测试结果

这确实在gcc 4.7.0中修复。您的代码生成以下汇编程序输出:

    .file   "constexpr.cpp"
    .globl  _ffx
    .section .rdata,"dr"
    .align 4
_ffx:
    .long   1

这是你可能想要的。升级?

我认为您需要针对此的平台特定解决方案。见Locating code and data in memory (Scatterloading)

  

Scatterloading允许您将应用程序划分为遍布地址映射的多个单独的代码和数据区域。这些区域的位置在加载时间和运行时间之间可能不同:

     
      
  1. 加载区域包含应用程序在开机/加载时使用的应用程序代码和/或数据(通常为ROM)。
  2.   

不要单独依赖gcc,而是按照上面提供的链接建议使用armlink

更新:我看到你注意到的gcc bug。 LLVM / MinGW同样没有希望。但是,我一直在玩GCC 4.6,这是我认为可以帮助你的东西:

struct Data
{
    int i;    
};
constexpr Data getData() { return Data{1}; }

如果不是拥有ctor,而是拥有constexpr函数,并尝试生成汇编程序输出,则输出通常为空(无.data个部分)。如果你使用它来初始化一些变量(在全局范围内),如下所示:

const Data foo = getData();

你得到如下的集会:

    .file   "constexpr.cpp"
    .section .rdata,"dr"
    .align 4
__ZL3foo:
    .long   1

(这是g++ -std=c++0x -S命令行)。这对你有用吗?

答案 1 :(得分:0)

根据我的经验,const数据被放入只读部分,因此本节中的所有数据都可以进入ROM(或编程为FLASH)。

GCC链接器指令文件(* .ld)可以将地址分配给不同的部分。

另一种方法是将大型数据结构(如字体)放入汇编语言中。汇编语言可以比C或C ++语言更容易将数据放入段中。

我们的下一个目标是将数据与可执行文件分开。这缩短了可执行文件并缩短了可执行文件的测试时间。