小编xiv*_*r77的帖子

在C中使用`inline`关键字有什么用?

我在stackoverflow中读了几个关于inlineC的问题,但仍然不清楚.

  1. static inline void f(void) {}没有实际的区别static void f(void) {}.
  2. inline void f(void) {}在C中不能像C++那样工作.它在C中如何工作?
  3. 究竟做了extern inline void f(void);什么?

我从来没有真正inline在我的C程序中找到关键字的使用,当我在其他人的代码中看到这个关键字时,它几乎总是static inline,我认为没有区别static.

c inline c99

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

如何携带找出min(INT_MAX,abs(INT_MIN))?

我怎样才能找到最小的INT_MAX和abs(INT_MIN)?(这是数学的绝对值INT_MIN,而不是对abs函数的调用.)

它应该与INT_MAX大多数系统一样,但我正在寻找一种更便携的方式.

c c++ math limits

30
推荐指数
3
解决办法
3201
查看次数

将有符号整数按位复制为无符号整数的有效方法

/* [1] */
int i = -1;
unsigned u = (unsigned)i;

/* [2] */
int i = -1;
unsigned u;
memcpy(&u, &i, sizeof i);

/* [3] */
int i = -1;
unsigned u = *(unsigned *)&i;
Run Code Online (Sandbox Code Playgroud)

为了将带符号的整数进行位复制到其未签名的伙伴,[1]应该可以在大多数机器上工作,但据我所知,这是不保证的行为.

[2] 应该做我想要的,但我想避免调用库函数的开销.

那怎么样[3]?它能有效地达到我想要的目的吗?

c c++

25
推荐指数
4
解决办法
1972
查看次数

在C++中分配和使用无类型内存块的正确方法是什么?

到目前为止,我对这个问题的答案有两个完全相反的答案:"它是安全的"和"它是未定义的行为".为了我和任何可能通过Google到达这里的人,我决定整体重写这个问题,以获得更好的澄清答案.

此外,我删除了C标签,现在这个问题是C++特定的

我正在制作一个8字节对齐的内存堆,将在我的虚拟机中使用.我能想到的最明显的方法是分配一个数组std::uint64_t.

std::unique_ptr<std::uint64_t[]> block(new std::uint64_t[100]);
Run Code Online (Sandbox Code Playgroud)

让我们假设sizeof(float) == 4sizeof(double) == 8.我想存储一个float和一个double block并打印该值.

float* pf = reinterpret_cast<float*>(&block[0]);
double* pd = reinterpret_cast<double*>(&block[1]);
*pf = 1.1;
*pd = 2.2;
std::cout << *pf << std::endl;
std::cout << *pd << std::endl;
Run Code Online (Sandbox Code Playgroud)

我还想存储一个说"你好"的C字符串.

char* pc = reinterpret_cast<char*>(&block[2]);
std::strcpy(pc, "hello\n");
std::cout << pc;
Run Code Online (Sandbox Code Playgroud)

现在我要存储"Hello,world!" 超过8个字节,但我仍然可以使用2个连续的单元格.

char* pc2 = reinterpret_cast<char*>(&block[3]);
std::strcpy(pc2, "Hello, world\n");
std::cout << pc2;
Run Code Online (Sandbox Code Playgroud)

对于整数,我不需要reinterpret_cast.

block[5] = 1;
std::cout << block[5] << std::endl;
Run Code Online (Sandbox Code Playgroud)

我将其分配block …

c++ memory-management

22
推荐指数
2
解决办法
2323
查看次数

gcc`__thread`如何工作?

如何__thread实现gcc?它只是一个包装pthread_getspecificpthread_setspecific

我的程序使用posix API进行TLS,现在我看到30%的程序运行时都用在了上面,我感到很失望pthread_getspecific.我在每个需要资源的函数调用的条目上调用它.pthread_getspecific在内联优化之后,编译器似乎没有优化.因此,在内联函数之后,代码基本上一次又一次地搜索正确的TLS指针以获得返回的相同指针.

__thread在这种情况下会帮助我吗?我知道thread_localC11中有,但我所拥有的gcc还不支持它.(但现在我看到我的gcc确实支持_Thread_local不是宏.)

我知道我可以简单地测试一下然后看看.但是我现在必须去别的地方了,在我尝试重大改写之前,我想更好地了解一个功能.

c multithreading gcc thread-local-storage

21
推荐指数
1
解决办法
2万
查看次数

什么是Haskell标准库?

GHC特定的库可以称为标准库吗?或者只有那些Haskell 2010报告中的那些?

许多GHC库可以通过Haskell报告中的函数实现,可能与C绑定结合使用.但是其他的依赖于GHC特定的扩展,因为语言报告中定义的当前Haskell语言不支持它.

例如,可以Data.Array.IO在纯标准的Haskell中实现吗?

认为GHC Haskell 真的可以吗?

haskell ghc

19
推荐指数
1
解决办法
1910
查看次数

C++异常的成本和setjmp/longjmp

我编写了一个测试来测量带有线程的C++异常的成本.

#include <cstdlib>
#include <iostream>
#include <vector>
#include <thread>

static const int N = 100000;

static void doSomething(int& n)
{
    --n;
    throw 1;
}

static void throwManyManyTimes()
{
    int n = N;
    while (n)
    {
        try
        {
            doSomething(n);
        }
        catch (int n)
        {
            switch (n)
            {
            case 1:
                continue;
            default:
                std::cout << "error" << std::endl;
                std::exit(EXIT_FAILURE);
            }
        }
    }
}

int main(void)
{
    int nCPUs = std::thread::hardware_concurrency();
    std::vector<std::thread> threads(nCPUs);
    for (int i = 0; i < nCPUs; ++i)
    {
        threads[i] …
Run Code Online (Sandbox Code Playgroud)

c c++ exception setjmp

16
推荐指数
1
解决办法
2203
查看次数

在C中,"没有声明类型的已分配对象"的C++等价物是什么?

我正在用C++为我的VM编写一个内存管理器.好吧,更确切地说,VM指令将被编译成带有嵌入式内存管理器的C++.我在处理C方面感觉更舒服,但现在我确实需要异常处理的原生支持,这几乎是我使用C++的唯一原因.

C和C++都有严格的别名规则,两个不兼容类型的对象不应重叠,在C中对于联合有一个小的例外.但是,以限定的存储器分配功能,如行为malloc,calloc,alloca等等,C标准具有以下段落.

6.5-6访问其存储值的对象的有效类型是对象的声明类型(如果有).已分配的对象没有声明的类型.如果通过具有非字符类型的左值的值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该值的后续访问的有效类型储值.如果使用memcpy或将值复制到没有声明类型的对象中memmove,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是有效类型复制值的对象,如果有的话.对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型.

这有效地使用原始分配的内存为任何类型在C中定义良好的行为.我试图在C++标准文档中找到类似的段落,但找不到一个.我认为C++在这方面有不同的方法.什么是C语言中"没有声明类型的已分配对象"的C++等价物,C++标准如何定义它?

c c++ memory

15
推荐指数
1
解决办法
582
查看次数

ar中的"rcs"选项有什么作用?

我确实阅读了man文件,但它没有帮助."rcs"似乎是传递给ar的最受欢迎的选项,但其含义并不是那么清楚.

所以"c"意味着创建一个新的档案,但为什么要使用"r"?哪个似乎代表"替换"?"s"选项对输出的作用是什么?

c gcc static-libraries unix-ar static-linking

12
推荐指数
2
解决办法
1万
查看次数

为什么不内联变量?

inlineC++中的关键字允许在头文件中定义函数,以便编译器可以实际内联它们或只保留函数的一个副本.这允许通过直接在头文件中定义函数来减少编译单元的数量,其优点通常是编译时间快几倍,并且执行速度可能更快.

为什么这个相同的模式不能应用于命名空间范围变量,而C++中的函数在将它们视为特殊指针时实际上是命名空间范围变量?

我能想到的是使用内联函数的静态局部变量.

inline std::string& Hello__() { //Edit: Added the &
    static std::string hello("Hello");
    return hello;
}

#define Hello (Hello__())
Run Code Online (Sandbox Code Playgroud)

编辑:我想澄清我的问题如下.

我正在使用术语'inline'作为编译器理解的内容.它允许具有相同名称的相同定义在多个编译单元中,允许标题中的定义."内联"的主要优点不是宏功能所具有的性能优势,而是编译单元数量减少所需的编译时间更短.它可能会短几倍.

我确实提出了一个解决方案,让变量像内联函数一样工作.但我仍然在寻找更好的方法来做到这一点.

为了清楚地说明,我想要实现的是在标题中定义名称空间范围变量,就像内联函数一样,以便使构建过程尽可能简单快速.


EDIT2:谢谢你的链接通过DYP评论.我刚读过这个提案,这正是我的想法.该提案的现状如何?

引自该提案:

然而,希望存在全局唯一对象而不必选择用于定义它的单个翻译单元并不罕见.实际上,做出这种选择通常需要使用非平凡的预处理器宏,单独编译的库或两者.但是,C++的一个优势是它支持headeronly库开发的能力.在这种情况下,缺乏定义内联变量的能力对库设计造成了重大限制.

c++ inline language-lawyer

12
推荐指数
2
解决办法
3798
查看次数