小编Pon*_*279的帖子

理解__libc_init_array

我从http://newlib.sourcearchive.com/documentation/1.18.0/init_8c-source.html查看了__libc_init_array的源代码.
但我不太明白这个功能是做什么的.

我知道这些符号

/* These magic symbols are provided by the linker.  */
extern void (*__preinit_array_start []) (void) __attribute__((weak));
extern void (*__preinit_array_end []) (void) __attribute__((weak));
extern void (*__init_array_start []) (void) __attribute__((weak));
extern void (*__init_array_end []) (void) __attribute__((weak));
extern void (*__fini_array_start []) (void) __attribute__((weak));
extern void (*__fini_array_end []) (void) __attribute__((weak));
Run Code Online (Sandbox Code Playgroud)

在链接描述文件中定义.
链接器脚本的一部分可能如下所示:

  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN …
Run Code Online (Sandbox Code Playgroud)

gcc startup elf linker-scripts newlib

11
推荐指数
3
解决办法
2万
查看次数

为什么std :: move返回的对象不会立即销毁

我测试了以下代码:

#include <iostream>
using namespace std;
class foo{
public:
    foo()       {cout<<"foo()"<<endl;}
    ~foo()      {cout<<"~foo()"<<endl;}
};

int main()
{
    foo f;
    move(f);
    cout<<"statement \"move(f);\" done."<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

foo()
statement "move(f);" done.
~foo()
Run Code Online (Sandbox Code Playgroud)

但是,我预计:

foo()
~foo()
statement "move(f);" done.
Run Code Online (Sandbox Code Playgroud)

根据函数移动的源代码:

  template<typename _Tp>
    constexpr typename std::remove_reference<_Tp>::type&&
    move(_Tp&& __t) noexcept
    { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
Run Code Online (Sandbox Code Playgroud)

返回的对象是一个正确的值,那么为什么不立即销毁呢?



-------------------------------------------------- ---------------
我想我只是混淆了rvalue和rvalue引用.
我修改了我的代码:

#include <iostream>

template<typename _Tp>
constexpr typename /**/std::remove_reference<_Tp>::type /* no && */
/**/ mymove /**/ (_Tp&& __t) noexcept
{ return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); } …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

7
推荐指数
2
解决办法
1778
查看次数

标签 统计

c++ ×1

c++11 ×1

elf ×1

gcc ×1

linker-scripts ×1

newlib ×1

startup ×1