小编SU3*_*SU3的帖子

malloc()和free()如何工作?

我想知道如何mallocfree工作.

int main() {
    unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char));
    memset(p,0,4);
    strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes**
    cout << p;
    free(p); // Obvious Crash, but I need how it works and why crash.
    cout << p;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果答案在记忆水平上是深入的,如果可能的话,我将非常感激.

c c++ malloc free memory-management

263
推荐指数
9
解决办法
14万
查看次数

什么是模板推导中的部分排序程序

阅读C++ 11标准我无法完全理解以下语句的含义.例子非常受欢迎.

两组类型用于确定部分排序.对于涉及的每个模板,都有原始函数类型和转换后的函数类型.[注意:转换类型的创建在14.5.6.2中描述. - 结束注释]演绎过程使用变换后的类型作为参数模板,将另一个模板的原始类型用作参数模板.对于部分排序比较中涉及的每种类型,此过程完成两次:一次使用转换的模板-1作为参数模板,使用template-2作为参数模板,再次使用转换的模板-2作为参数模板和模板-1作为参数模板
- N3242 14.8.2.4.2

c++ templates partial-ordering c++11 template-argument-deduction

34
推荐指数
1
解决办法
3210
查看次数

Protobuf:set_allocated_*会删除分配的对象吗?

我有这个小的protobuf代码(简化,只包含必要的):

message ParamsMessage {
    required int32 temperature = 1;
}

message MasterMessage {
    enum Type { GETPARAMS = 1; SENDPARAMS = 2;}
    required Type type = 1;

    optional ParamsMessage paramsMessage = 2;

}
Run Code Online (Sandbox Code Playgroud)

我现在以下列方式创建一个MasterMessage:

ParamsMessage * params = new ParamsMessage();
params->set_temperature(22);
MasterMessage master;
master.set_type(MasterMessage::SENDPARAMS);
master.set_allocated_paramsmessage(params);
Run Code Online (Sandbox Code Playgroud)

问题是:我是否必须(在处理消息后)删除params消息,或者将protobuf删除给我?我在文档中找不到任何内容.

c++ protocol-buffers

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

SFINAE模板专业化优先级

#include <iostream>
#include <array>
#include <vector>

template <typename T, typename SFINAE=void>
struct trait;

template <typename T>
struct trait<T, decltype(
  std::declval<const T&>().begin(),
  std::declval<const T&>().end(),
  void()
)> {
  static const char* name() { return "Container"; }
};

template <typename T, std::size_t N>
struct trait<std::array<T,N>> {
  static const char* name() { return "std::array"; }
};

int main(int argc, char* argv[]) {
  std::cout << trait<std::vector<int>>::name() << std::endl;
  std::cout << trait<std::array<int,2>>::name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我期待第三个模板比第二个模板更专业,但我得到了一个模糊的模板实例化.

有没有办法让第三个模板更专业?明确检查是否Tstd::array在第二个模板不会为我工作.我正在写一个图书馆,希望用户能够定义他们自己的专业trait.第二个模板旨在成为没有更具体特征的容器的通用特化.

c++ templates sfinae template-specialization

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

使用gcc没有小的字符串优化?

大多数std::string实现(包括GCC)使用小字符串优化.例如,有一个答案在讨论这个问题.

今天,我决定检查我编译的代码中的字符串在什么时候被移动到堆中.令我惊讶的是,我的测试代码似乎表明根本没有发生小的字符串优化!

码:

#include <iostream>
#include <string>

using std::cout;
using std::endl;

int main(int argc, char* argv[]) {
  std::string s;

  cout << "capacity: " << s.capacity() << endl;

  cout << (void*)s.c_str() << " | " << s << endl;
  for (int i=0; i<33; ++i) {
    s += 'a';
    cout << (void*)s.c_str() << " | " << s << endl;
  }

}
Run Code Online (Sandbox Code Playgroud)

输出g++ test.cc && ./a.out

capacity: 0
0x7fe405f6afb8 | 
0x7b0c38 | a
0x7b0c68 | aa …
Run Code Online (Sandbox Code Playgroud)

c++ memory string optimization gcc

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

无法从braced-init-list构造constexpr数组

我已经实现了constexpr这样的数组:

template <typename T>
class const_array {
  const T* p;
  unsigned n;
public:
  template <unsigned N>
  constexpr const_array(const T(&a)[N]): p(a), n(N) { }

  constexpr unsigned size() const { return n; }
};

int main(int argc, char* argv[]) {
  // works
  static_assert(const_array<double>{{1.,2.,3.}}.size() == 3);

  // doesn't compile
  constexpr const_array<double> a{{1.,2.,3.}};
  static_assert(a.size() == 3);
}
Run Code Online (Sandbox Code Playgroud)

为什么第一次static_assert编译,但初始化a失败?我正在使用gcc 6.2.0.我越来越

: In function 'int main(int, char**)':
: error: 'const_array<double>{((const double*)(&<anonymous>)), 3u}' is not a constant expression
   constexpr const_array<double> a{{1.,2.,3.}}; …
Run Code Online (Sandbox Code Playgroud)

c++ arrays constructor constexpr c++14

14
推荐指数
1
解决办法
547
查看次数

如何从bash脚本中获取文件

我正在尝试使用我的bash脚本中的环境变量来源文件,但它不起作用.

这是我的脚本(test.sh)的内容,位于~/scripts/test.sh.

#!/bin/bash
FILE_NAME=/tmp/source_file
touch $FILE_NAME
echo "export TEST=\"test\"" > $FILE_NAME
source $FILE_NAME
Run Code Online (Sandbox Code Playgroud)

然后,我用aliasmy ~/.bashrc.

alias testScript=~/scripts/test.sh
Run Code Online (Sandbox Code Playgroud)

但是当我使用我的脚本时testScript,它没有设置环境变量.

linux bash shell environment-variables

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

为什么这个lambda可以流动?

令我惊讶的是,以下代码打印出来1.

std::cout << [](const char* arg){ return arg[0]=='s'; } << std::endl;
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

c++ lambda cout c++11

11
推荐指数
1
解决办法
780
查看次数

C++ 编译器会优化重复的函数调用吗?

编译器(通常或特别)是否优化重复的函数调用?

例如,考虑这种情况。

struct foo {
  member_type m;
  return_type f() const; // returns by value
};
Run Code Online (Sandbox Code Playgroud)

函数定义在一个翻译单元中

return_type foo::f() const {
  /* do some computation using the value of m */
  /* return by value */
}
Run Code Online (Sandbox Code Playgroud)

重复的函数调用在另一个单元中

foo bar;

some_other_function_a(bar.f());
some_other_function_b(bar.f());
Run Code Online (Sandbox Code Playgroud)

第二个翻译单元中的代码会转换成这个吗?

foo bar;

const return_type _tmp_bar_f = bar.f();

some_other_function_a(_tmp_bar_f);
some_other_function_b(_tmp_bar_f);
Run Code Online (Sandbox Code Playgroud)

潜在地,计算f确实可能很昂贵,但返回的类型可能非常小(考虑一个返回 a 的数学函数double)。编译器会这样做吗?有没有他们做或不做的情况?您可以考虑这个问题的广义版本,而不仅仅是成员函数或没有参数的函数。

根据@BaummitAugen 的建议澄清

我更感兴趣的是这里问题的理论方面,而不是人们是否可以依靠它来使现实世界的代码运行得更快。我对 Linux 上 x86_64 上的 GCC 尤其感兴趣。

c++ compiler-optimization

8
推荐指数
1
解决办法
1867
查看次数

C++ lambda返回自己

我想写一个返回自己的lambda,所以我可以在现场多次调用它.但看起来lambda内部this不是指lambda而是指周围对象this,如果lambda是在成员函数内定义的话.

这是一个例子:

#include <iostream>

int main(int argc, char* argv[]) {
  int a = 5;
  [&](int b) {
    std::cout << (a + b) << std::endl;
    return *this;
  }(4)(6);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做一些类似的事情?

c++ lambda

8
推荐指数
2
解决办法
412
查看次数