GVKun编程网logo

ELF文件的.bss部分应该放在哪里?(elf文件详解)

23

如果您对ELF文件的.bss部分应该放在哪里?和elf文件详解感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解ELF文件的.bss部分应该放在哪里?的各种细节,并对elf文件详解进行深入的分析,

如果您对ELF文件的.bss部分应该放在哪里?elf文件详解感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解ELF文件的.bss部分应该放在哪里?的各种细节,并对elf文件详解进行深入的分析,此外还有关于(转)script标签到底该放在哪里、@Autowired注释应该放在哪里-属性或方法上?、asp.net – MS Chart控件创建的临时文件应该放在哪里?、c – 嵌套命名空间中模板类的前向声明:默认模板参数应该放在哪里?的实用技巧。

本文目录一览:

ELF文件的.bss部分应该放在哪里?(elf文件详解)

ELF文件的.bss部分应该放在哪里?(elf文件详解)

已知.bss段不存储在磁盘中,但内存中的.bss段应初始化为零。 但是它应该把内存放在哪里呢? 是否有任何信息显示在ELF头部或者.bss部分是否可能出现在数据部分的旁边,或者其他的东西?

Perl内存不足

CUDA和固定(页面locking)内存不是页面locking?

禁用交换(分页文件)以确保一切都在内存中

我如何识别无效的内存地址?

Linux内核如何决定使用哪个内存区域?

要知道bss段在内存中的位置,运行readelf -S program就足够了,并检查.bss行的Addr列。

在大多数情况下,您还会看到已初始化的数据部分( .data )即将出现。 也就是说,您将看到.data节的Addr + Size与.bss节的起始地址匹配。

但是,情况并非总是如此。 这些都是历史惯例, ELF规范 (与平台特定的补充一起阅读,例如在包含32位x86机器的第5章中)允许更复杂的配置,并不是所有的配置都受Linux支持。

例如,该部分根本就不能被称为.bss 。 制作BSS部分的唯一两个属性是:

该部分用SHT_NOBITS标记(即在存储器中占用空间,但在存储器上没有空间),在readelf的输出中显示为NOBITS 。

它映射到可加载( PT_LOAD ),可读( PF_R )和可写( PF_W )段。 存储器上的这种段也比存储器中短( p_filesz < p_memsz )。

您可以有多个BSS部分:PowerPC可执行文件可能具有.sbss和.sbss2用于未初始化的数据变量。

最后,BSS部分不一定与数据部分或堆相邻。 如果你检查Linux内核 (尤其是load_elf_binary函数),你可以看到BSS段(或者更确切地说,它映射到的段 )甚至可以与代码和初始化数据交错。 Linux内核设法将其排除。

BSS介于数据和堆之间,详见这篇奇妙的文章 。

您可以使用size找出每个部分的size :

cnicutar@lemon:~$ size try text data bss dec hex filename 1108 496 16 1620 654 try

总结

以上是小编为你收集整理的ELF文件的.bss部分应该放在哪里?全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

(转)script标签到底该放在哪里

(转)script标签到底该放在哪里

 一般script标签会被放在头部或尾部。头部就是<head>里面,尾部一般指<body>里[4-5]。

将script放在<head>里,浏览器解析HTML,发现script标签时,会先下载完所有这些script,再往下解析其他的HTML。讨厌的是浏览器在下载JS时,是不能多个JS并发一起下载的。不管JS是不来来自同一个host,浏览器最多只能同时下载两个JS,且浏览器下载JS时,就block掉解析其他HTML的工作[1]。将script放在头部,会让网页内容呈现滞后,导致用户感觉到卡。所以yahoo建议将script放在尾部,这样能加速网页加载。

将script放在尾部的缺点,是浏览器只能先解析完整个HTML页面,再下载JS。而对于一些高度依赖于JS的网页,就会显得慢了。所以将script放在尾部也不是最优解,最优解是一边解析页面,一边下载JS。

所以[2]提出了一种更modern的方式:使用async和defer。80%的现代浏览器都认识async和defer属性[3],这两个属性能让浏览器做到一边下载JS(还是只能同时下载两个JS),一边解析HTML。他的优点不是增加JS的并发下载数量,而是做到下载时不block解析HTML。

 
<script type="text/javascript" src="path/to/script1.js" async></script>  
<script type="text/javascript" src="path/to/script2.js" async></script>  

 带async属性的script会异步执行,只要下载完就执行,这会导致script2.js可能先于script1.js执行(如果script2.js比较大,下载慢)。defer就能保证script有序执行,script1.js先执行,script2.js后执行。
 结论
 1. [2]认为,如果可以不考虑支持<IE9的IE,最好的做法是将script标签放在head中,并使用async/defer属性。这样浏览器就能一边下载JS,一边解析其他的HTML。
 2. Google自己的代码script放的也有点乱,有的放在</body>后面[6],有的放在<body>里面[7],还有的放在<head>里面[8]。总体来说,放在<body>里其实是最常见的做法。
 3. 本文只讨论script的位置,至于link和style,还是放在head里的做法比较常见。link也是要下载CSS的啊,为毛不考虑下载CSS阻塞HTML解析的问题呢?其实,一般情况下,JS和CSS,放在head和放在body区别不大。CSS的link放在body也是可以的,只是可能导致页面暂时没有样式[9-10]。
 参考
 [1] https://developer.yahoo.com/performance/rules.html#js_bottom=
 [2] http://stackoverflow.com/questions/436411/where-is-the-best-place-to-put-script-tags-in-html-markup
 [3] http://caniuse.com/#search=defer
 [4] https://github.com/IgorMinar/foodme/blob/master/app/index.html
 [5] https://github.com/GoogleChrome/wReader-app/blob/master/index.html
 [6] https://github.com/GoogleChrome/multi-device/blob/master/_preview.html
 [7] https://github.com/GoogleChrome/samples/blob/b2668086c25470e107e59f4ffa92dc0c21c63de3/beacon/index.html
 [8] https://github.com/GoogleChrome/web-audio-samples/blob/gh-pages/samples/audio/adaptive-release.html
 [9] http://stackoverflow.com/questions/4957446/load-external-css-file-in-body-tag
 [10] http://stackoverflow.com/questions/1642212/whats-the-difference-if-i-put-css-file-inside-head-or-body

转载于猿2048:➫《(转)script标签到底该放在哪里》

@Autowired注释应该放在哪里-属性或方法上?

@Autowired注释应该放在哪里-属性或方法上?

如何解决@Autowired注释应该放在哪里-属性或方法上??

我个人更喜欢你的第一个选择(构造函数注入),因为该myDao字段可以标记为final:

@Controller
public class MyControllear {
    private final MyDao myDao;

    @Autowired
    public MyController(MyDao myDao) {
      this.myDao = myDao;
    }

构造函数注入还允许你在单元测试中测试类,而无需依赖Spring的代码。

第二种选择最好写成:

@Controller
public class MyControllear {
    @Autowired
    private MyDao myDao;

    MyController() {
    }

使用字段注入,Spring将创建对象,然后更新标记为注入的字段。

你没有提到的一个选项是@Autowired使用setter方法(setter注入):

@Controller
public class MyControllear {
    private MyDao myDao;

    MyController() {
    }

    @Autowired
    public void setMyDao(MyDao myDao) {
      this.myDao = myDao;
    }

你不必选择一个或另一个。你可以将字段注入用于某些依赖项,并将构造函数注入用于其他针对同一对象的注入。

解决方法

哪个更正确?

这(在方法上带有@Autowired注释)?

@Controller
public class MyController
{
    private MyDao myDao;

    @Autowired
    public MyController(MyDao myDao)
    {
        this.myDao = myDao;
    }

这(在属性上带有@Autowired注释)?

@Controller
public class MyController
{
    @Autowired
    private MyDao myDao;

    public MyController(MyDao myDao)
    {
        this.myDao = myDao;
    }

@Autowired注释应该去哪里?

asp.net – MS Chart控件创建的临时文件应该放在哪里?

asp.net – MS Chart控件创建的临时文件应该放在哪里?

默认位置:
<add key="ChartimageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />

适合开发,但在IIS上部署不太好.我发现一个论坛帖子提到你可以完全删除路径,它将临时文件直接转储到我项目的根目录中

<add key="ChartimageHandler" value="storage=file;timeout=20;" />

我不想弄乱我的根文件夹,所以我现在就解决这个问题:

<add key="ChartimageHandler" value="storage=file;timeout=20;url=~/App_Data/ChartimageTemp/;" />

想法或其他人在做什么?我有点好奇为什么这甚至是一个可配置的选项.我使用.net 3.5,也许这在4.0中有所不同?

解决方法

一个相关的问题:

MSChart: ChartImageHandler pros/cons of the different storage settings

我指的是Scott Mitchell的一篇文章:

http://www.4guysfromrolla.com/articles/081909-1.aspx

我决定使用“内存”选项,因此没有配置的文件或路径:

<appSettings> 
      <add key="ChartimageHandler" value="storage=memory;deleteAfterServicing=true;"/> 
   </appSettings>

c – 嵌套命名空间中模板类的前向声明:默认模板参数应该放在哪里?

c – 嵌套命名空间中模板类的前向声明:默认模板参数应该放在哪里?

我在嵌套命名空间中有一个模板类的前向声明
namespace n1
{
    namespace n2
    {
        template <typename T,typename S>
        struct A;
    }
    using n2::A;
}

后跟一个定义,实际上是在一个不同的文件中,其间有东西:

struct X { };

namespace n1
{
    namespace n2
    {
        template <typename T,typename S = X>
        struct A { };
    }
    using n2::A;
}

然后以下总是好的:

n1::n2::A <int> a;

但这个捷径

n1::A <int> a;

在clang中给出编译错误

error: too few template arguments for class template 'A'

除非我删除了前瞻性声明; g接受两者.

clang似乎与第一个不包含默认模板参数的声明保持一致(我不能包含它,因为我还没有定义X).

如果我使用单个命名空间没有问题(但这不是一个解决方案).

我做错了什么,或者哪个编译器是正确的?快捷方式如何与前向声明和嵌套命名空间一起工作?我需要他们所有人.

S的前向声明X默认参数当然有效,但实际上太繁琐(实际上有几十个,整个文件结构都会改变).

解决方法

模板< class T>使用myname = some :: templatething< T>;

然后你可以使用myname

在你的情况下,坚持模板< class T,class S = X>使用A = n2 :: A< T,S&gt ;;在你的n1 刚写了一篇关于这个Symbol not found when using template defined in a library的答案的宝石有btw,有一个阅读.

好吧,它没有被勾选,所以我会帮助更多!

不会编译

#include <iostream>

namespace n1 {
namespace n2 {
template<class U,class V> struct A;
}
template<class U,class V> using A = n2::A<U,V>;
}

static n1::A<int,int>* test;

struct X {};
namespace n1 {
namespace n2 {
template<class U,class V> struct A {};
}
template<class U,class V=X> using A = n2::A<U,V>;
}

static n1::A<int> test2;


int main(int,char**) {

    return 0;
}

为什么? C的“第一宣言规则”

这是编译器的输出:

make all 
if ! g++ -Isrc -Wall -Wextra -O3 -std=c++11 -g -gdwarf-2 -Wno-write-strings  -MM src/main.cpp >> build/main.o.d ; then rm build/main.o.d ; exit 1 ; fi
g++ -Wall -Wextra -O3 -std=c++11 -g -gdwarf-2 -Wno-write-strings  -Isrc -c src/main.cpp -o build/main.o
src/main.cpp:26:17: error: wrong number of template arguments (1,should be 2)
 static n1::A<int> test2;
                 ^
src/main.cpp:13:47: error: provided for ‘template<class U,class V> using A = n1::n2::A<U,V>’
 template<class U,V>;
                                               ^
src/main.cpp:26:24: error: invalid type in declaration before ‘;’ token
 static n1::A<int> test2;
                        ^
src/main.cpp:16:24: warning: ‘test’ defined but not used [-Wunused-variable]
 static n1::A<int,int>* test;
                        ^
src/main.cpp:26:19: warning: ‘test2’ defined but not used [-Wunused-variable]
 static n1::A<int> test2;
                   ^
make: *** [build/main.o] Error

好吧,它对未使用的变量抱怨,公平,但注意它是对第13行的引用,那是因为它使用了第一个定义默认模板参数非常原始,我现在不能引用规范.
https://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fdefault_args_for_templ_params.htm

这可能会提供一些见解.

无论如何注意到:

这编译

#include <iostream>

namespace n1 {
namespace n2 {
template<class U,class V=X> using B = n2::A<U,V>;
}

static n1::B<int> test2;


int main(int,char**) {

    return 0;
}

因为B没有先前的定义.

构建输出

make all 
if ! g++ -Isrc -Wall -Wextra -O3 -std=c++11 -g -gdwarf-2 -Wno-write-strings  -MM src/main.cpp >> build/main.o.d ; then rm build/main.o.d ; exit 1 ; fi
g++ -Wall -Wextra -O3 -std=c++11 -g -gdwarf-2 -Wno-write-strings  -Isrc -c src/main.cpp -o build/main.o
src/main.cpp:16:24: warning: ‘test’ defined but not used [-Wunused-variable]
 static n1::A<int,int>* test;
                        ^
src/main.cpp:26:19: warning: ‘test2’ defined but not used [-Wunused-variable]
 static n1::B<int> test2;
                   ^
g++  build/main.o  -o a.out

看,好:)

请记住,使用前向声明,您只能使用* s和& s(因为它们具有已知大小,固定大小) – 哦和&& s

所以你需要立即在那里获得默认值!

我们今天的关于ELF文件的.bss部分应该放在哪里?elf文件详解的分享已经告一段落,感谢您的关注,如果您想了解更多关于(转)script标签到底该放在哪里、@Autowired注释应该放在哪里-属性或方法上?、asp.net – MS Chart控件创建的临时文件应该放在哪里?、c – 嵌套命名空间中模板类的前向声明:默认模板参数应该放在哪里?的相关信息,请在本站查询。

本文标签: