小编Moh*_*HME的帖子

从函数返回对象时,是否调用C++中的复制构造函数?

我理解在三个实例上调用复制构造函数

  1. 实例化一个对象并使用另一个对象的值初始化它时.
  2. 按值传递对象时.

3.按值从函数返回对象时.

我有问题,如果在返回对象值时调用了复制构造函数,如果在函数中本地声明了对象,则不应该产生问题.

我的意思是复制构造函数是一个深拷贝,并将对象的引用作为参数

c++ constructor copy-constructor

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

从真实模式切换到保护模式后跳远

根据本教程,创建一个简单的操作系统就足够了,切换到保护模式就像下面的代码一样简单,无需其他众所周知的操作,如启用A20 ...

无论如何,我是这个领域的新手,我写了下面的代码,因为他们提到了这个SO的修改.

代码结构: 这个简单的操作系统应简要加载如下:

  1. 加载/读取15个扇区
  2. 启用GDT
  3. 切换到保护模式(并打印"成功登陆32位保护模式").
  4. 加载内核并打印"X"

但是,模拟器仍在重新启动.请查看随附的整个代码.

bootloader.asm

[bits 16]
[org 0x7C00]

KERNEL_OFFSET equ 0x1000

xor ax, ax
mov ds, ax
mov es, ax
mov [BOOT_DRIVE], dl
mov ax, 0x07E0                  ; End of stack
cli
mov ss, ax
mov sp, 0x1200                  ; Size of Stack. By this, we assume that stack starts at 9000h
                            ; of size 1200h and ends at 7E00h to avoid being overwritten.
sti

call    load_kernel
call    switch_to_pm

jmp $ …
Run Code Online (Sandbox Code Playgroud)

c assembly operating-system intel bootloader

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

强制 TCP 套接字达到特定的窗口大小

我正在不同的 DC 之间发送 TCP 消息(RTT:27 毫秒)。

拥有千兆位网络 (1Gb/s),我决定放置RWIN3 MB。

我知道如何修改net.core.rmem_maxnet.core.wmem_max

我检查了窗口缩放是否已启用net.ipv4.tcp_window_scaling = 1

但是,我想知道:是否可以手动修改窗口大小还是自动完成。请解释。

sockets tcp

5
推荐指数
0
解决办法
1485
查看次数

以实模式列出BIOS驱动器号的任何方法

有没有办法在实模式下列出BIOS驱动器索引(例如0x80,0x81 ......)?

我没有找到任何负责列出驱动器号码的中断!!

x86 assembly real-mode bios nasm

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

uintmax_t 不处理 128 位

我想在我的代码中定义千兆字节,所以我首先使用unsigned long. 然而unsigned long无法处理2 * gigabyte

\n\n

所以,我将其替换为long long但得到了相同的编译错误/警告:\n错误:表达式中的整数溢出[-Werror =溢出]

\n\n

最后,我查找了大整数,发现 uintmax_t 正是我所需要的,因为它是 128 位。

\n\n

不幸的是,我仍然遇到同样的错误。我猜有一个小错误,但我能找到它。

\n\n

请在下面找到相关代码:

\n\n
#define kilobyte 1024\n#define megabyte 1024 * kilobyte\n#define gigabyte 1024 * megabyte\nuintmax_t threshold = 2 * gigabyte;\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,运行“make”后

\n\n
g++ -Wall -Wextra -Werror -pedantic -pthread -std=c++0x -g  -o lcr main.cpp\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有:

\n\n
main.cpp: In function \xe2\x80\x98int main(int, char**)\xe2\x80\x99:\nmain.cpp:104:17: error: integer overflow in expression [-Werror=overflow]\ncc1plus: all warnings being treated as errors\n …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors primitive-types

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

引导x86机器时的默认寄存器和段值

我发现通常程序员在启动加载程序的第一行就对寄存器(有时是段)进行修正,并且他们通常会为此建议。例如:

inc cx
dec bx
inc bp
dec di
xor ax, ax
Run Code Online (Sandbox Code Playgroud)

我不知道我知道的是:BIOS在引导过程中清除了所有寄存器

在引导加载程序中初始化寄存器和段是个好习惯吗?如果是,默认寄存器,段和指针值是什么(可能取决于芯片组)?

x86 assembly bios bootloader

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

C++11 中互斥锁与 pthread 兼容吗?

尽管如此,使用 C++11 pthread_mutexmutex ( ) 会使 pthread 安全吗?#include <mutex>

请往下找一个例子:

// Creating Server thread
pthread_create(&server_thread, NULL,Server,NULL);

// Creating Client thread
pthread_create(&client_thread, NULL, Client,NULL);

// Wait until client_thread exits
pthread_join( client_thread, NULL);
Run Code Online (Sandbox Code Playgroud)

服务器和客户端都调用foo().

mutex mut;
void foo (){
     mut.lock();
     CRITICAL_WRITE();
     mut.unlock();
}
Run Code Online (Sandbox Code Playgroud)

mutex pthreads c++11

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

类破坏时内存损坏(双重免费)

有谁请解释这个案例:为什么我在这个简单的代码中面临'双重免费'问题?

void Rreceive (myclass){}

int main () {
    myclass msg (1);
    Rreceive(msg);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在哪里myclass:

class myclass
{
    private:
        HeaderType header;
        byte * text;    

    public:
        myclass(int ID);
        ~myclass();
        HeaderType getHeader();
        byte * getText();
};

myclass::myclass(int ID){
    header.mID = ID;
    text = (byte *)malloc (10);
    memset (text, '.', 10);
}

myclass::~myclass(){
    free (text);
}

HeaderType myclass::getHeader(){
    return header;
}

byte * myclass::getText(){
    return text;
}
Run Code Online (Sandbox Code Playgroud)

和HeaderType是:

typedef struct {
    int mID;
}HeaderType;
Run Code Online (Sandbox Code Playgroud)

错误是: *** glibc detected *** ./test: …

c++ free destructor

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

如何在C/C++中填写struct padding?

假设我有以下结构:

typedef struct {
    int mID;
    struct in_addr mIP;
    size_t dataSize;
    // Another structure
    fairness_structure str;
    bool ack;
    bool stability;
    bool stop_message;
}HeaderType;
Run Code Online (Sandbox Code Playgroud)

如您所知,结构的大小会因其对齐而有所不同.如何用一些数据填充字段之间的填充,比如用零填充?

c c++ struct padding

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

如何使用read()在C++套接字中接收超过40Kb

我正在使用C++在Linux中开发客户端 - 服务器应用程序(TCP).该应用程序负责测试网络性能.客户端和服务器之间的连接只建立一次,然后使用write()/read()自己定义的协议发送/接收数据.

当数据超过40Kb时,我只收到一部分数据.(即我收到约48KB)

请找到代码的相关部分:

while (1) {
        servMtx.lock();
        ...
        serv_bytes = (byte *) malloc(size_bytes);
        n = read(newsockfd, serv_bytes,size_bytes);
        if (n != (int)size_bytes ) {
            std::cerr << "No enough data available for msg. Received just: " << n << std::endl;
            continue;
        }
        receivedBytes += n + size_header_bytes + sizeof(ssize_t);
        ....
}
Run Code Online (Sandbox Code Playgroud)

我使用以下内容将内核缓冲区大小增加到1MB:

int buffsize = 1024*1024;
setsockopt(newsockfd, SOL_SOCKET, SO_RCVBUF, &buffsize, sizeof(buffsize)); 
Run Code Online (Sandbox Code Playgroud)

和修改过的sysctl变量:

sysctl -w net.core.rmem_max = 8388608; sysctl -w net.core.wmem_max = 8388608;

如上所述如何使用recv()在C++套接字中恢复超过65000个字节但没有任何改变.此外,我试图改变包装尺寸无济于事.

c++ sockets buffer

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

检查内存是否已在C中释放

如您所知,在我们完成使用动态变量之后我们就free()可以了.

但是,有时这些变量已经是free()d.

我需要检查是否可以免费避免双重免费.有人能给我一个线索吗?

c memory free

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