小编5go*_*der的帖子

C数据类型如何"大多数计算机直接支持"?

我正在阅读K&R的"The C Programming Language"并且发现了这个声明[Introduction,p.3]:

由于大多数计算机都直接支持C提供的数据类型和控制结构,因此实现自包含程序所需的运行时库很小.

粗体陈述是什么意思?是否存在计算机直接支持的数据类型或控制结构的示例?

c

114
推荐指数
7
解决办法
7189
查看次数

std :: system_clock和std :: steady_clock之间的区别?

std::system_clock和之间有什么区别std::steady_clock?(说明不同结果/行为的示例案例会很棒).

如果我的目标是精确测量的功能(如基准)的执行时间,这将是之间是最好的选择std::system_clock,std::steady_clockstd::high_resolution_clock

c++ timer c++11 c++-chrono

85
推荐指数
5
解决办法
4万
查看次数

字符串的Java输出格式

我想知道是否有人可以告诉我如何使用Java字符串的格式方法.例如,如果我想要所有输出的宽度相同

例如,假设我总是希望我的输出是相同的

Name =              Bob
Age =               27
Occupation =        Student
Status =            Single
Run Code Online (Sandbox Code Playgroud)

在这个例子中,所有输出都在彼此之间整齐地格式化; 我将如何使用format方法完成此操作.

java formatting

44
推荐指数
4
解决办法
12万
查看次数

指向未指定大小的数组"(*p)[]"在C++中是非法的,但在C中是合法的

我刚刚发现这在C++中是非法的(但在C语言中是合法的):

#include <stdio.h>
#include <stdlib.h>
#define ARRAY_LENGTH(A) (sizeof(A) / sizeof(A[0]))

int accumulate(int n, const int (*array)[])
{
    int i;
    int sum = 0;
    for (i = 0; i < n; ++i) {
        sum += (*array)[i];
    }
    return sum;
}

int main(void)
{
    int a[] = {3, 4, 2, 4, 6, 1, -40, 23, 35};
    printf("%d\n", accumulate(ARRAY_LENGTH(a), &a));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它编译没有问题使用gcc -std=c89 -pedantic但无法编译使用g++.当我尝试使用它来编译它时,g++我收到以下错误消息:

main.cpp:5:37: error: parameter 'array' includes pointer to array of unknown bound …
Run Code Online (Sandbox Code Playgroud)

c c++ arrays pointers function

33
推荐指数
2
解决办法
4926
查看次数

静态内联,外部内联和普通内联函数之间有什么区别?

什么是之间的区别static inline,extern inline和正常的inline功能?

我已经看到了一些模糊的解释.据我所知,static inline不仅仅是一个inline仅在某个文件中引用的函数,因为static关键字通常意味着.这同样适用于extern inline过我想,这是不一样的解释与extern变量.任何答案将不胜感激!

c static extern inline-functions

25
推荐指数
1
解决办法
8011
查看次数

使用const初始化constexpr, - int vs float

我想知道为什么整数ii在编译时初始化,但不是浮点数ff:

int main() {
  const int i = 1;
  constexpr int ii = i;

  const float f = 1.0;
  constexpr float ff = f;
 }
Run Code Online (Sandbox Code Playgroud)

这是我尝试编译时会发生的事情:

> g++ -std=c++11 test.cc
test.cc: In function ‘int main()’:
test.cc:6:24: error: the value of ‘f’ is not usable in a constant expression
   constexpr float ff = f;
                        ^
test.cc:5:15: note: ‘f’ was not declared ‘constexpr’
   const float f = 1.0;
Run Code Online (Sandbox Code Playgroud)

c++ constexpr

23
推荐指数
2
解决办法
2205
查看次数

关于在构造函数中绑定临时成员的虚假警告

我理解如果临时绑定到构造函数的初始化列表中的引用成员,则该对象将在构造函数返回时被销毁.

但是,请考虑以下代码:

#include <functional>
#include <iostream>

using callback_func = std::function<int(void)>;

int
func(const callback_func& callback)
{
  struct wrapper
  {
    const callback_func& w_cb;
    wrapper(const callback_func& cb) : w_cb {cb} { }
    int call() { return this->w_cb() + this->w_cb(); }
  };
  wrapper wrp {callback};
  return wrp.call();
}

int
main()
{
  std::cout << func([](){ return 21; }) << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这看起来对我来说完全有效.该callback对象将在整个func函数执行期间生效,并且不应为其wrapper构造函数创建临时副本.

实际上,GCC 4.9.0在启用所有警告的情况下编译正常.

但是,GCC 4.8.2编译器给了我以下警告:

$ g++ -std=c++11 -W …
Run Code Online (Sandbox Code Playgroud)

c++ g++ object-lifetime c++11

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

新的C++代码应该使用内存资源而不是分配器吗?

C++ 17将为我们带来std::pmr::memory_resource一个分配和释放内存的干净界面.与Allocator概念不同,它就是这样,此而已.还有一个将std::pmr::polymorphic_allocator内存资源包装到经典分配器中,因此它可以与现有容器一起使用.

如果我要编写一个针对C++ 17及更高版本的新容器(或其他需要大量内存的),我应该继续针对Allocator概念进行编程,还是直接使用更新更清晰的抽象?

截至目前,我的想法是这样的.

继续使用分配器的原因:

  • 它与标准库和现有代码一致.甚至新std::pmr::*容器别名也继续使用分配器.
  • 由于内存资源可以包装成a std::pmr::polymorphic_allocator,因此分配器接口更通用,可以满足更多客户端的需求.
  • 内存资源总是使用运行时多态,因此与分配器可以提供的零开销抽象相比,它们具有较小的额外运行时开销.
  • 也许某人实际上需要分配器接口的其他部分(例如自定义指针类型),这些部分不能由纯内存资源提供.

开始使用内存资源而不是分配器的原因:

  • 分配器接口很笨重,难以实现.该std::pmr::memory_resource界面是干净和简单.
  • 由于内存资源是多态的,它们不会影响容器的类型,这意味着更少的模板实例化(因此可能更快的编译和更小的可执行文件),并使我们能够将更多的代码移动到单独的翻译单元中.
  • 如果一个对象使用一个内存资源,它总是可以实例化一个仍然使用分配器的子对象,方法是将内存资源包装成一个std::pmr::polymorphic_allocator.反过来说比较困难.
  • 无论如何,内存分配是一项相对工作密集的任务.相对而言,单个虚函数调用不会增加太多开销.

是否已经有关于如何有效使用新库功能的建议?

c++ memory-management allocator c++17

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

GNU将转换空间转换为冒号

给定以冒号分隔的路径列表,使用GNU Make获取以空格分隔的列表非常简单:

CPATHS := /usr/bin/foo:/usr/bin/baz:/usr/bin/baz
SPATHS := $(subst :, ,$(CPATHS))
Run Code Online (Sandbox Code Playgroud)

但是,我找不到朝着相反方向前进的好方法.以下hack确实有效(至少在安装了sed的情况下)但是我很确定只有使用Make的内部函数才能有更好的解决方法.

SPATHS := /usr/bin/foo /usr/bin/baz /usr/bin/baz
CPATHS := $(shell echo $(SPATHS) > tmp; sed 's/ \+/:/g' tmp; rm tmp)
Run Code Online (Sandbox Code Playgroud)

makefile space path gnu-make colon

18
推荐指数
2
解决办法
4363
查看次数

如何解释ldd程序的输出?

[root@wdctc1281 bin]#  ldd node
        linux-vdso.so.1 =>  (0x00007fffd33f2000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f70f7855000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f70f764d000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f70f7345000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f70f7043000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f70f6e2d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f70f6c10000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f70f684f000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f70f7a61000)
Run Code Online (Sandbox Code Playgroud)

第一行和最后一行是什么意思?它们看起来不像正常

xxxx.so => /lib64/xxxxx.so (0xxxxxxxxxxxxxxxxxxxx)
Run Code Online (Sandbox Code Playgroud)

格式.

linux gnu binutils ldd

18
推荐指数
2
解决办法
4935
查看次数