我对如何在C++中进行内联函数感到困惑....
让我们说这个功能.如何转向内联函数
int maximum( int x, int y, int z )
{
int max = x;
if ( y > max )
max = y;
if ( z > max )
max = z;
return max;
}
Run Code Online (Sandbox Code Playgroud) 几年前我写了一些代码.它一直运行良好,但在最近在其他地方重新构建了一些新的,不相关的代码后,它已不再有效.这是代码:
//myobject.h
...
inline CMapStringToOb* GetMap(void) {return (m_lpcMap);};
...
Run Code Online (Sandbox Code Playgroud)
以上是从主应用程序访问,如下所示:
//otherclass.cpp
...
CMapStringToOb* lpcMap = static_cast<CMyObject*>(m_lpcBaseClass)->GetMap();
...
Run Code Online (Sandbox Code Playgroud)
就像我说的,这个WAS工作了很长时间,但它刚刚决定从我们最近的版本开始失败.我调试了这个,我能够看到,在设置指针的代码中,它正确地将内存地址设置为实际值.我甚至可以进入set函数,写下内存地址,然后转到这个函数,让它得到0xfdfdfdfd,然后在调试器中手动获取内存地址.这会导致代码工作.现在,从我所读到的,0xfdfdfdfd意味着保护字节或"没有人的土地",但我真的不明白它的含义是什么.据说它也意味着一个错误,但我不明白如果代码以前工作可能会发生这种情况.
在C++中,可以使用inline关键字将函数定义为内联.这就像程序员从编译器请求在函数调用的每个地方插入函数的完整主体.
但据我所知,编制者没有义务尊重这一要求.那么有什么方法可以保证函数内联?
我写了这段代码:
inline int a_plus_b_power2(int a, int b) {
return (a + b) * (a + b);
}
int main() {
for(int a = 0; a < 9999999999999; ++a)
for(int b = 0; b < 999999999999; ++b)
a_plus_b_power2(a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是为什么这个程序的二进制文件与这个程序没有区别:
inline int a_plus_b_power2(int a, int b) {
return (a + b) * (a + b);
}
int main() {
for(int a = 0; a < 9; ++a)
for(int b = 0; b < 9; ++b)
a_plus_b_power2(a, b);
return …Run Code Online (Sandbox Code Playgroud) 我有一个1行inline函数,它是我的代码中的热点的一部分.我想看看将此更改为宏是否有益.写作功能我不必担心副作用.但是如何在没有副作用的情况下为此编写宏?
#define FLAG1_BIT 4
struct node
{
unsigned long key;
struct node* child[K]; //format <address,flag1,flag2,flag3>
};
static inline bool isFlag1Set(struct node* p)
{
return ((uintptr_t) p & FLAG1_BIT) != 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在将实时内核TNeoKernel移植到Cortex-M架构,所以我安装了Keil并且正在尝试构建内核.但是,我遇到了意想不到的问题:编译器似乎无法处理inline函数.这是简单的代码:
static inline int test(void)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器的输出如下:
src\appl\main.c(17): warning: #260-D: explicit type is missing ("int" assumed)
static inline int test(void)
src\appl\main.c(17): error: #65: expected a ";"
static inline int test(void)
Run Code Online (Sandbox Code Playgroud)
如果我删除inline关键字,它会编译并运行.
在ARM编译器的文档中,我找不到任何关于inline函数的信息.因此,只是为了确保:inlineARM编译器是否真的不支持该关键字?这太令人难以置信所以我决定问.
我static inline在内核的独立于平台的代码中有很多函数,那么,它支持ARM编译器的最佳方法是什么?在我的头脑中,我只有两个想法:
TN_INLINE,对于ARM编译器,它应该扩展为空;通过阅读标准,我无法确定以下代码是否违反了 ODR:
// a.h
#ifndef A_HEADER_FILE
#define A_HEADER_FILE
namespace {
int v;
}
inline int get_v() { return v; }
#endif // A_HEADER_FILE
// a.cpp
#include "a.h"
void f() {
int i = get_v();
// ...
}
// b.cpp
#include "a.h"
void g() {
int i = get_v();
// ...
}
Run Code Online (Sandbox Code Playgroud)
(来源:https : //wiki.sei.cmu.edu/confluence/display/cplusplus/DCL59-CPP.+Do+not+define+an+unnamed+namespace+in+a+header+file)
据说,get_v()在每个翻译单元中引用了不同的变量,因此它违反了ODR。
这个答案:内联函数和外部链接说内联放松ODR所以我不确定为什么这仍然是一个错误?
如果这是否ODR违规,有人可以将我链接到标准中指定的位置吗?
c++ one-definition-rule inline-functions linkage language-lawyer
由于内联函数将替换代码中的实际调用,因此将内联函数作为const调用有什么用。
Inline void adddata() const {...}
Run Code Online (Sandbox Code Playgroud)