小编Cal*_*ius的帖子

为什么oop语言不支持单独的访问修饰符进行读写?

我经常发现自己编写getter和setter只是因为获取和设置需要不同的访问级别.那些getter和setter是微不足道的(getter只返回,setter只设置值,里面没有其他代码).您希望仅为外部世界读取字段值的典型情况(并为每个字段编写一大堆getter函数.)

吸气剂和定位器是引擎盖下的功能.调用函数比设置字段,因为你需要复制参数,推送和弹出堆栈帧,复制结果等.

好吧,编译器可以优化函数调用并内联赋值,但这是你无法控制的.即使是c ++中的inline关键字也只是一个提示,编译器可以自由地忽略它.你应该假设一个函数被调用,它会慢一些.

此外,从来没有语言(如C#)支持属性并模仿这个东西,但它们只不过是看起来像字段的函数,你甚至不能告诉它它是一个函数或一个字段(没有IDE的帮助).

如果我们可以为写入和读取设置不同的访问修饰符(比如文件系统那样)会产生什么问题,除了告诉它会违反封装的教条原则?

oop language-design design-principles

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

Visual C++ express 2008:为什么它会在发布可执行文件的末尾放置空字节的megs?

最近我发现我的发布可执行文件(用msvc ++ express 2008制作)变得非常大.当我用十六进制查看器检查可执行文件时,我看到只有前300k字节包含有用数据,其余字节只有零 - 6兆字节的零字节.

debug built exe的大小为1MB,但发行版为6.5MB.

为什么MSVC++ express会做那些无用的事情?我该如何解决?

c++ size release-mode visual-c++

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

操作系统和实现独立访问键盘?

我用MSVC++做了一个FPS游戏,它在Windows上运行得很好.但现在我试图让它可移植(至少我想创建一个Linux和Windows版本),所以我决定将IDE更改为Code :: Blocks,将框架更改为wxWidgets.但似乎虚拟键码和扫描码在不同系统上是不同的.

之前我曾经历过,即使在同一个操作系统上,虚拟键码也可能不同但计算机不同(我得到了关于他们无法控制角色的bug报告(取决于numlock状态,lol,而不是笑话),这在修改后修复了代码使用扫描码而不是virtkey代码)(编辑:使用wxWidgets,numpad上的virtkey和扫描代码具有不同的值,具体取决于numlock状态,砰!)

现在使用wxWidgets,似乎wxKeyEvent :: GetRawKeyCode和之前从WM_KEYDOWN的lParam获得的代码是不同的.我还从GetRawKeyCode获得了一个完全不同的linux(ubuntu)扫描代码.

好吧,我可以通过按下所有键并查看它给出的代码来制作我自己的扫描码表,但是ubuntu在我的笔记本电脑上运行的唯一问题是,笔记本电脑没有全键盘...但我需要所有这些使控制设置工作.

所以问题是:是否有一种标准的跨平台方式来获得相同密钥的相同代码(相同位置的密钥更精确)?(至少在Windows和Linux上)

keyboard cross-platform scancodes

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

为什么不能将数字添加到关联容器的迭代器中?

我有一个std :: set,我想通过集合中的元素对进行迭代,所以我写了2个循环,如下所示:

for(std::set<T>::iterator i=mySet.begin();i!=mySet.end();++i)
{
    for(std::set<T>::iterator j=i+1;j!=mySet.end();++j)
    {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器告诉我,我无法向迭代器添加数字.但是我可以增加和减少它们.解决方法我发现我可以跳过第一次迭代:

for(std::set<T>::iterator i=mySet.begin();i!=mySet.end();++i)
{
    std::set<T>::iterator j=i;
    for(++j;j!=mySet.end();++j)
    {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能只添加一个数字为什么我必须增加?

c++ containers stl

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

x87 FPU指令是否确定?

我们正在编写一个模拟器,并想知道对于给定的FPU状态,是运行FPU指令后FPU确定性的状态,例如.FDIV?

有许多Intel兼容的CPU架构,它们实现了x87指令集.在测试FPU仿真的正确性时,我们应该依赖于生成的CPU状态吗?

不同的实现是围绕/计算不同的吗?

floating-point cpu x87

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

C 是否允许将结构类型强制转换为自身?

所以我们有一个像这样的结构类型:

typedef struct
{
    U64 low;
    U64 high; 
} U128;
Run Code Online (Sandbox Code Playgroud)

然后,由于宏扩展,代码中的某处有一个如下所示的赋值:

*ptr = (U128)value;
Run Code Online (Sandbox Code Playgroud)

ptr是哪里的U128*. 这会导致以下错误:

error C2440: 'type cast' : cannot convert from 'U128' to 'U128'
Run Code Online (Sandbox Code Playgroud)

问题是:C 中允许这样的自转换吗?我刚刚发现了编译器错误吗?

附加问题:

这是一个通用宏,允许 8、16、32、64、128 等作为参数,其他类型被 typedefd 作为数字并且可以正常工作:有任何解决方法吗?出于性能原因,我想避免 memcpy。

c struct visual-studio-2008 visual-c++

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

EndDialog vs DestroyWindow

我正在创建Windows上下文菜单的模仿.

显示对话框执行以下操作:

  1. 使用创建对话框 CreateDialogIndirectParam
  2. 运行消息循环:

    while ( ContinueModal() && GetMessage(&msg, NULL, 0, 0) )
    {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我在新窗口中寻找丢失焦点事件的对话框,我将ContinueModel标志设置为false并调用EndDialog/ DestroyWindow.

    • 调用EndDialog不会杀死我的对话框DestroyWindow.这没关系,任何人都可以解释原因吗?

谢谢!D.

c++ windows winapi win32gui windows-messages

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

如何静态制作gcc链接libssp?

如何让GCC使用静态库而不是动态库?通常,您将.a文件添加到链接器参数.但是libssp链接是由-fstack-protector选项触发的.如果编译器找到一个而不是静态库,则编译器更喜欢链接到共享库.

如果我尝试在没有libssp.so的系统上运行生成的程序,程序将无法运行.

(在某些构建机器上进行系统升级后,测试系统上的旧盒子搞砸了)

linux gcc

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

如何只在gdb中打印变量的值?

所以我有这个gdb命令的脚本:

$ cat gdb_commands.txt
set pagination off
set logging file output.txt
set logging on
file stuff
b *0x80000014
run
echo ***DIFF THIS***\n
echo eax:
print $eax
echo ebx:
print $ebx
echo ecx:
print $ecx
echo edx:
print $edx
echo ***DIFF THIS END***\n
quit
Run Code Online (Sandbox Code Playgroud)

如果我运行它我得到这个:

$ gdb -q -x gdb_commands.txt
Breakpoint 1 at 0x80000014

Breakpoint 1, 0x80000014 in _start ()
***DIFF THIS***
eax:$1 = 1
ebx:$2 = 2
ecx:$3 = 3
edx:$4 = 4
***DIFF THIS END***
A debugging session is …
Run Code Online (Sandbox Code Playgroud)

gdb

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

是否可以编写使用指针指向用户提供的分配函数的自定义STL分配器?

我们有一个提供C接口的库extern "C",并且是从C代码中使用的,但是它内部使用STL容器和一些C++功能(如RAII)以方便使用.

现在有一个新的要求,即库应该能够指向来自客户端代码的自定义mallocfree函数,并将其用于内部的分配.我可以将它们放入库的上下文结构中,并在需要的地方使用它们,但是将它们与STL一起使用是令人费解的......

我查看了allocator类,但似乎STL容器必须能够使用默认构造函数来创建分配器,似乎没有办法将这些指针放入它们中,让它们通过它们调用来进行分配.

是否有可能以线程安全的方式(不使用全局变量)来解决这个问题?

c++ allocator

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

Linux平台上的mmap查询

在 Linux 机器上,尝试编写驱动程序并尝试将一些内核内存映射到应用程序以提高性能。在线检查 mmap 的驱动程序实现,找到不同的实现方式。根据手册页,mmap - 在调用进程的虚拟地址空间中创建新的映射。

1)mmap调用时谁分配物理地址空间?内核还是设备驱动程序?

看到以下各种驱动程序 mmap 实现。

a) 驱动程序创建连续的物理内核内存并将其映射到进程地址空间。

static int driver_mmap(struct file *filp, struct vm_area_struct *vma)
{
    unsigned long size = vma->vm_end - vma->vm_start;

    pos = kmalloc(size); //allocate contiguous physical memory.
    while (size > 0) {
        unsigned long pfn;
        pfn = virt_to_phys((void *) pos) >> PAGE_SHIFT; // Get Page frame number
        if (remap_pfn_range(vma, start, pfn, PAGE_SIZE, PAGE_SHARED)) // creates mapping
            return -EAGAIN;
        start += PAGE_SIZE;
        pos += PAGE_SIZE;
        size -= PAGE_SIZE;
    }
}
Run Code Online (Sandbox Code Playgroud)

b) 驱动程序创建虚拟内核内存并将其映射到进程地址空间。 …

memory-management mmap linux-device-driver linux-kernel

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

访问localhost时SVG无法正常工作.为什么?

有人知道为什么这个页面http://emacsformacosx.com/中的相同代码在托管在本地tomcat服务器上时不会呈现?

我正在尝试使用一些SVG,但无法看到它在本地工作.有任何想法吗?

xhtml svg localhost

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