草庐IT

static、extern、inline 说明符和链接属性

概述-Overview在我初学C++时,static、inline、extern可能是最令我迷惑的C++说明符,原因是它们在不同的语境下会发挥不同的作用,而且某些说明符的含义已经和以前不同,这加剧了我在查询资料时的困扰。所以今天决定好好总结一下。首先要介绍C++的两个概念:存储期和链接。存储期-StoragedurationC++程序中,任何对象[1]都有一个存储期,它是下列四个之一:自动存储期:对象在代码块开始时分配,代码块结束时解分配。静态存储期:对象在整个程序开始时分配,程序结束时解分配。线程存储期:对象在某个线程开始时分配,线程结束时解分配。动态存储期:对象使用某些特定的表达式来进行分

c++ - 内联函数指针以避免 if 语句

在我的jpg解码器中,我有一个带有if语句的循环,该语句将始终为真或始终为假,具体取决于图像。我可以创建两个单独的函数来避免if语句,但出于好奇我想知道使用函数指针而不是if语句对效率有什么影响。如果为真,它将指向内联函数;如果为假,它将指向一个空的内联函数。classjpg{private://emtpyfunctionvoidinlinenothing();//realfunctionvoidinlinefunction();//pointertoinlinefunctionvoid(jpg::*functionptr)()=nullptr;}jpg::nothing(){}mai

c++ - 寻找有关静态和内联函数的说明

最初,我认为static和inline对函数的含义如下:警告:这是我过去的想法,不要认为这是正确的。static函数只存在一次。所有使用它的东西都使用相同的功能。*inline函数的内容大概被复制到调用函数中。编译器实际上可能会忽略这一点,但对于非模板头文件中的定义,它们有必要避免重复定义。staticinline函数,我还没弄明白那是什么意思。*请注意,类模板有效地生成类,因此它们的静态内容对于每个派生类型是完全不同的。我从C++forJavaProgrammers(MarkAllenWeiss,ISBN0-13-919424-X)这本书中得到了这种印象。在第2.1.6段,它说:In

c++ - 类中定义的静态成员函数是否隐式内联?

据我所知,在类中定义的每个非静态成员函数都是隐式内联的。现在我想知道这是否对静态成员函数有效,考虑到我可以在不同的翻译单元中多次定义该函数。举个例子:classFoo{public:staticvoidstatic_f(void){std::coutPS:在本文档(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf)中,我发现了这一行:9.4.1Staticmemberfunctions[class.static.mfct]1[Note:Therulesdescribedin9.3applytostatic

c++ - 具有私有(private)数据成员的内联类函数

现在我一直在学习内联函数,遇到了一些让我很困惑的事情看这门课classNebla{private:intx;public:inlinevoidset(inty){x=y;}inlinevoidprint(){cout它有一个私有(private)数据成员:intx;它有两个公共(public)内联函数:set(inty)和print()现在因为它们两个函数是内联的,所以当它们被调用时,编译器会用函数的内容替换函数调用。如果我这样做Neblan;n.set(1);n.print();因为这两个函数是内联的,所以应该等同于:Neblan;n.x=1;cout但是等一下,x是私有(priva

c++ - C++ 中宏相对于内联的优势

我们知道内联是有利的,因为它们会被编译器检查,并且与宏相比,相同的操作(如++x)作为参数传递时不会计算多次。但在一次采访中,我被问及宏更适合在C++中内联的具体优势或情况。有没有人知道答案或可以对这个问题给出一个想法? 最佳答案 我唯一能想到的是,有些技巧可以用宏来实现,而不能用内联函数来实现。在编译时将标记粘贴在一起,以及那种骇客行为。 关于c++-C++中宏相对于内联的优势,我们在StackOverflow上找到一个类似的问题: https://stac

c++ - 内联还有用吗?

这个问题在这里已经有了答案:WhenshouldIwritethekeyword'inline'forafunction/method?(16个回答)3年前关闭。我相信,inline已过时,因为我读过here:Nomatterhowyoudesignateafunctionasinline,itisarequestthatthecompilerisallowedtoignore:thecompilermightinline-expandsome,all,ornoneoftheplaceswhereyoucallafunctiondesignatedasinline.然而,Angew似乎

c++ - 如何对类定义中定义的模板成员函数使用显式模板实例化?

为了减少大量使用模板的大型项目的编译时间,我使用“外部模板”(explicittemplateinstantiation)来防止在许多不同的编译单元中定义通用模板函数,取得了很好的效果.但是,一件令人讨厌的事情是它不适用于类定义中定义的成员函数。例如,我有以下模板类:templatestructFoo{staticTdoubleIt(Tinput){returninput*2;}};现在,我知道Foo最常用于数字类型,所以我将其添加到标题中:externtemplatestructFoo;externtemplatestructFoo;externtemplatestructFoo;然

c++ - 不断结合优化编译器

我有一个包含很多小内联函数的头文件。他们中的大多数恰好有常量数据。由于这些函数对性能至关重要,因此它们处理常量的方式变得很重要。据我所知,有两种方法可以引用常量:1)在稍后与应用程序链接的单独源文件中定义它们。2)就地定义常量。我会选择后一种方式,因为它更易于维护。但是,如果编译器不优化通过内联创建的数千个相等常量,它可能会变慢。问题:编译器会合并这些相等的常量吗?具体而言,将使用以下哪些方法?1)跨编译单元组合相等常量。2)跨链接模块(整个程序或库)组合相等常量3)将常量与碰巧具有相同位模式并满足编译单元或整个程序对齐要求的任何静态常量数据组合。我使用现代编译器(GCC4.5)。我不

c++ - "inlined"类的惩罚

VisualStudio允许您创建“内联”类(如果我没记错名字的话)。所以类头和实现都在一个文件中。H.文件包含类和函数的定义和声明,根本没有.cpp文件。所以我想知道这样做是否会受到惩罚?有什么缺点吗?非常感谢 最佳答案 anypenaltyfordoingitthatway?anydisadvantages?是的。如果您需要更改该类的实现,因为它在头文件中,该类的所有用户都需要重新编译,即使他们应该只关心接口(interface)。对于某些项目,这可能非常昂贵。 关于c++-"inl