小编Sal*_*gar的帖子

关于填充和继承,类和结构之间的区别

以下所有操作均将在GCC 9.1上使用x86-64中的Compiler Explorer在上完成-O3

我有以下代码:

struct Base {
    Base() {}
    double foo;
    int bar;
};

struct Derived : public Base {
    int baz;
};

int main(int argc, char** argv)
{
    return sizeof(Derived);
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/OjSCZB

16如我所料,它正确地返回的8个字节foo,的4个字节bar和的4个字节baz。这仅是因为Derived继承自Base,因此bar由于Derived是同时包含BaseDerived元素的单一类型而不必填充。

我有两个问题,如下所示:

第一个问题

如果我删除的显式构造函数Base() {},它将开始返回24,而不是16。也就是说,它在bar和之后添加了填充baz

https://godbolt.org/z/0gaN5h

我无法解释为什么拥有显式默认构造函数与具有隐式默认构造函数有什么不同。

第二个问题

如果然后我更改structclassfor Base …

c++ gcc c++11

43
推荐指数
2
解决办法
1154
查看次数

如何声明extern"C"函数指针

所以我有这个代码:

#include "boost_bind.h"
#include <math.h>
#include <vector>
#include <algorithm>

double foo(double num, double (*func)(double)) {
  return 65.4;
}

int main(int argc, char** argv) {
  std::vector<double> vec;
  vec.push_back(5.0);
  vec.push_back(6.0);
  std::transform(vec.begin(), vec.end(), vec.begin(), boost::bind(foo, _1, log));
}
Run Code Online (Sandbox Code Playgroud)

并收到此错误:

        return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
.............................................................^
%CXX-E-INCOMPATIBLEPRM, argument of type "double (* __ptr64 )(double) C" is
          incompatible with parameter of type "double (* __ptr64 )(double)"
          detected during:
            instantiation of ...5 pages of boost
Run Code Online (Sandbox Code Playgroud)

所以这个错误是因为'log'在math.h中是外部的"C"

我想知道如何在foo()中声明我的函数指针参数,以便它处理extern"C"函数.

c++ function-pointers boost-bind

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

如何使我的 sizeof sum 结构与空参数包一起工作

我有这个可变参数结构来确定传入的所有类型的大小总和:

template <typename U, typename... T> struct TotalSizeOf 
    : std::integral_constant<size_t, sizeof(U) + TotalSizeOf<T...>::value> {};

template <typename U> struct TotalSizeOf<U> 
    : std::integral_constant<size_t, sizeof(U)> {};
Run Code Online (Sandbox Code Playgroud)

用法: TotalSizeOf<double, int, char>::value

问题是,我如何修改它以允许它处理空参数包,返回0

例如 TotalSizeOf<>::value

目前,我收到错误 error: wrong number of template arguments (0, should be at least 1)

我只有 C++14 可用。

c++ c++14

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

什么时候可以在Linux上调用时间(NULL)失败

根据此文档http://www.cplusplus.com/reference/clibrary/ctime/time/

for time(NULL)"如果函数无法检索日历时间,则返回-1值."

这是我应该在我的代码中检查的内容吗?如果时间(NULL)没有检索时间,肯定会出现一些错误.

c time

7
推荐指数
1
解决办法
1611
查看次数

模板化参数中函子的默认参数

我想在函数中使用函子参数的默认lambda值。

我知道可以使用structoperator()这样的代码:

struct AddOne {
    int operator()(int a) {
        return a+1;
    }
};

template <typename Functor = AddOne>
int run_old(int x, Functor func = AddOne()) 
{
    return func(x);
}
Run Code Online (Sandbox Code Playgroud)

但是我想知道,考虑到c ++ 14/17/20中标准的变化,是否存在一种现代化的方法来使这项工作有效?

template <typename Functor>
int run_new(int x, Functor func = [](int a){ return a+1; }) 
{
    return func(x);
}
Run Code Online (Sandbox Code Playgroud)

我不确定使用哪种类型作为Functor的默认类型,或者不确定是否有语法我不知道。

https://godbolt.org/z/Hs6vQs

c++ lambda template-argument-deduction c++14 c++17

7
推荐指数
1
解决办法
160
查看次数

为什么sscanf与bool类型无法正常工作

这段代码的输出:

const char *buff = "*_2D 1";
char field[10];
int flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%i\n", field, flag);
Run Code Online (Sandbox Code Playgroud)

field:*_2D flag:1

但是通过更改intto bool导致奇怪的行为:

const char *buff = "*_2D 1";
char field[10];
bool flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%i\n", field, flag);
Run Code Online (Sandbox Code Playgroud)

输出是 field: flag:1

任何人都可以解释这里发生了什么?我会认为bool会被解释为一个int,它似乎是,但字符串的其余部分消失了.

c c++ boolean scanf

6
推荐指数
1
解决办法
3598
查看次数

可以在Linux上跨用户使用POSIX消息队列吗?

我已经实现了POSIX消息队列.在听众方面,我打开这样的队列:

mqdes = mq_open(s_mailbox_name.c_str(), O_RDONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO, NULL);

在发件人方面,我正在打开这样的队列:

mqdes = mq_open(m_s_mailbox_name.c_str(), O_WRONLY);

字符串在两者上都是相同的,让我们调用它 /foobox

现在,当我将发送者和接收者作为盒子上的同一个用户运行时,一切都运行良好.但是,如果发送方和接收方是2个不同的用户,则接收方无法打开队列.我认为这不会是一个问题,因为我打开队列为0777,所以每个人都可以RWX.

有什么明显的东西我做错了吗?或者这是不可能的(请不要让它成为这个)

谢谢

c++ linux posix message-queue

5
推荐指数
1
解决办法
761
查看次数

静态链接对库实际上做了什么?

假设我有一个名为库的库libfoo,其中包含一个类,一些静态变量,可能是"C"链接,还有一些其他函数.

现在我有一个主程序,看起来像这样:

int main() {
   return 5+5;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并链接这个时,我链接反对libfoo.

这会有什么影响吗?我的可执行文件会增加吗?如果是这样,为什么?静态变量或其地址是否被复制到我的可执行文件中?

如果对此有类似的问题,或者我以任何方式特别愚蠢,请道歉.

c c++ linker static-linking

4
推荐指数
1
解决办法
491
查看次数

如何每隔30秒从服务器执行一个脚本 - apache

如何每隔30秒从服务器执行一个php脚本?

我有一个PHP脚本,我需要每30秒执行一次,以通过curl从其他网站检索一些信息.

但我不知道每30秒就用apache在后台运行一个php页面.

php apache execution

3
推荐指数
1
解决办法
3862
查看次数

Linux IPC - 多个编写器,单个读取器

我之前从未在Linux上编写任何IPC C++.

我的问题是我将拥有多个客户端(编写器)和一个服务器(读取器).所有这些都将在同一台机器上.作者将向读者提供数据块(字符串/结构).然后读者将在FIFO中读取它们并对它们执行某些操作.

据我所知,Linux上的IPC类型是管道或套接字/消息队列.

我只是想知道是否有人可以推荐我走下去的路.我倾向于插座,但我没有真正的基础.在踏上这段旅程之前,有什么我应该阅读/理解的吗?

谢谢

c++ linux client-server ipc

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

Linux上的增长文件是否需要花费任

这两种情况之间的速度是否存在明显差异?

场景1:我有一个大小为1024字节的文件,每个字节都填充0.我打开文件,用fwrite写入1024字节的1s.

场景2:我有一个大小为512字节的文件,每个字节都填充0.我打开文件,用fwrite写入1024字节的1s.

显然我最终得到了相同的文件,但在调整磁盘上的第二个文件时是否有任何损失?

我正在尝试确定在使用它们之前调整文件大小是否有任何价值.奖励指向任何能够向我展示一些Linux文档以证明这一点的人.

c++ linux performance disk

0
推荐指数
1
解决办法
203
查看次数