我正在阅读K&R的"The C Programming Language"并且发现了这个声明[Introduction,p.3]:
由于大多数计算机都直接支持C提供的数据类型和控制结构,因此实现自包含程序所需的运行时库很小.
粗体陈述是什么意思?是否存在计算机不直接支持的数据类型或控制结构的示例?
std::system_clock和之间有什么区别std::steady_clock?(说明不同结果/行为的示例案例会很棒).
如果我的目标是精确测量的功能(如基准)的执行时间,这将是之间是最好的选择std::system_clock,std::steady_clock和std::high_resolution_clock?
我想知道是否有人可以告诉我如何使用Java字符串的格式方法.例如,如果我想要所有输出的宽度相同
例如,假设我总是希望我的输出是相同的
Name = Bob
Age = 27
Occupation = Student
Status = Single
Run Code Online (Sandbox Code Playgroud)
在这个例子中,所有输出都在彼此之间整齐地格式化; 我将如何使用format方法完成此操作.
我刚刚发现这在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) 什么是之间的区别static inline,extern inline和正常的inline功能?
我已经看到了一些模糊的解释.据我所知,static inline不仅仅是一个inline仅在某个文件中引用的函数,因为static关键字通常意味着.这同样适用于extern inline过我想,这是不一样的解释与extern变量.任何答案将不胜感激!
我想知道为什么整数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) 我理解如果临时绑定到构造函数的初始化列表中的引用成员,则该对象将在构造函数返回时被销毁.
但是,请考虑以下代码:
#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++ 17将为我们带来std::pmr::memory_resource一个分配和释放内存的干净界面.与Allocator概念不同,它就是这样,仅此而已.还有一个将std::pmr::polymorphic_allocator内存资源包装到经典分配器中,因此它可以与现有容器一起使用.
如果我要编写一个针对C++ 17及更高版本的新容器(或其他需要大量内存的),我应该继续针对Allocator概念进行编程,还是直接使用更新更清晰的抽象?
截至目前,我的想法是这样的.
继续使用分配器的原因:
std::pmr::*容器别名也继续使用分配器.std::pmr::polymorphic_allocator,因此分配器接口更通用,可以满足更多客户端的需求.开始使用内存资源而不是分配器的原因:
std::pmr::memory_resource界面是干净和简单.std::pmr::polymorphic_allocator.反过来说比较困难.是否已经有关于如何有效使用新库功能的建议?
给定以冒号分隔的路径列表,使用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) [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)
格式.