相关疑难解决方法(0)

结构填料和包装

考虑:

struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;
Run Code Online (Sandbox Code Playgroud)

结构的尺寸分别为12和8.

这些结构是填充还是包装?

什么时候进行填充或包装?

c struct structure packing padding

189
推荐指数
6
解决办法
25万
查看次数

在C中使用#pragma

#pragmaC中有哪些用途,有例子?

c pragma

107
推荐指数
7
解决办法
19万
查看次数

如何安全地将对象(尤其是STL对象)传入DLL或从DLL传递?

如何将类对象(尤其是STL对象)传递给C++ DLL?

我的应用程序必须以DLL文件的形式与第三方插件交互,我无法控制这些插件构建的编译器.我知道STL对象没有保证ABI,我担心我的应用程序会导致不稳定.

c++ windows dll stl abi

99
推荐指数
4
解决办法
3万
查看次数

使用printf打印size_t的正确方法是什么?

Size_t被定义为一个unsigned整数,但它的大小取决于你是在32位还是64位机器上.什么是正确和便携的打印方式size_t

c c++

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

c ++和opencv获取并设置像素颜色为Mat

我正在尝试将一些像素的新颜色值设置为cv :: Mat图像,我的代码如下:

    Mat image = img;
    for(int y=0;y<img.rows;y++)
    {
        for(int x=0;x<img.cols;x++)
        {
        Vec3b color = image.at<Vec3b>(Point(x,y));
        if(color[0] > 150 && color[1] > 150 && color[2] > 150)
        {
            color[0] = 0;
            color[1] = 0;
            color[2] = 0;
            cout << "Pixel >200 :" << x << "," << y << endl;
        }
        else
        {
            color.val[0] = 255;
            color.val[1] = 255;
            color.val[2] = 255;
        }
    }
    imwrite("../images/imgopti"+to_string(i)+".tiff",image);
Run Code Online (Sandbox Code Playgroud)

它似乎在输出中获得了良好的像素(使用cout),但是在输出图像中(使用imwrite),相关的像素不会被修改.我已经尝试过使用color.val [0] ..我仍然无法弄清楚为什么输出图像中的像素颜色不会改变.谢谢

c++ opencv pixel image-processing mat

37
推荐指数
3
解决办法
13万
查看次数

C未定义的行为.严格别名规则或错误对齐?

我无法解释这个程序的执行行为:

#include <string> 
#include <cstdlib> 
#include <stdio.h>

typedef char u8;
typedef unsigned short u16;

size_t f(u8 *keyc, size_t len)
{
    u16 *key2 = (u16 *) (keyc + 1);
    size_t hash = len;
    len = len / 2;

    for (size_t i = 0; i < len; ++i)
        hash += key2[i];
    return hash;
}

int main()
{
    srand(time(NULL));
    size_t len;
    scanf("%lu", &len);
    u8 x[len];
    for (size_t i = 0; i < len; i++)
        x[i] = rand();

    printf("out %lu\n", f(x, len));
}
Run Code Online (Sandbox Code Playgroud)

因此,当使用带有gcc的-O3编译并使用参数25运行时,它会引发段错误.没有优化它工作正常.我已经对它进行了反汇编:它正在进行矢量化,并且编译器假定 …

c gcc strict-aliasing memory-alignment

13
推荐指数
3
解决办法
2368
查看次数

是否有一种巧妙的方法可以避免在 C++ 中使用嵌套类进行额外填充?

这些结构体align1andalign2包含相同的数据,但align1由于嵌套布局而具有更多填充。我怎样才能获得align2while的内存节省对齐,同时也使用像 in 这样的嵌套结构align1

int main() {
    struct align1 {
        struct {
            double d;    // 8 bytes
            bool b1;    //+1 byte (+ 7 bytes padding) = 16 bytes
        } subStruct;
        bool b2;        //+1 byte (+ 7 bytes padding) = 24 bytes
    };
    struct align2 {
        double d;        // 8 bytes
        bool b1, b2;    //+2 byte (+ 6 bytes padding) = 16 bytes
    };

    std::cout << "align1: " << sizeof(align1) << " …
Run Code Online (Sandbox Code Playgroud)

c++ padding inner-classes memory-alignment compiler-optimization

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

"pragma pack 1"可以帮助避免堆碎片吗?

在我的程序中,我看到一些居民规模增加.我想这是因为堆碎片.所以我打算用#pragma pack 1.它会减少堆碎片吗?

它会有其他一些开销吗?

我要不要去吧?

c c++ memory-management memory-fragmentation

11
推荐指数
4
解决办法
1259
查看次数

用new []分配n个字节并用任何类型填充它?

我想动态分配已知大小的内存(只是内存,不打扰类型),并用完全相同数量的数据填充它,但任何类型(我只确定它将是原始类型).以后我会释放它.

好吗?:

auto dest = new int8_t[n];
std::memcpy(dest, src, n);
delete[] dest;
Run Code Online (Sandbox Code Playgroud)

src是ptr到一个大小的数组n(字节).我选择int8_t这是因为它是分配一定数量内存的最清晰方式.事实上,上面的代码并不是exaclt它将是什么.delete[]将在实际指向的类型的指针上调用.所以例如,如果src是一个浮点数组(忘记上面代码的最后一行):

float * ptr = dest;
delete[] ptr;
Run Code Online (Sandbox Code Playgroud)

再说一遍.会没事吗?

c++ memory

9
推荐指数
2
解决办法
2640
查看次数

sizeof(),C结构中的对齐方式:

前言: 我对结构对齐的研究.看着这个问题,一个也是这个 - 但仍然没有找到我的答案.

我的实际问题:

这是我创建的代码片段,以澄清我的问题:

#include "stdafx.h"
#include <stdio.h>

struct IntAndCharStruct
{
    int a;
    char b;
};

struct IntAndDoubleStruct
{
    int a;
    double d;
};

struct IntFloatAndDoubleStruct
{
    int a;
    float c;
    double d;
};

int main()
{
    printf("Int: %d\n", sizeof(int));
    printf("Float: %d\n", sizeof(float));
    printf("Char: %d\n", sizeof(char));
    printf("Double: %d\n", sizeof(double));
    printf("IntAndCharStruct: %d\n", sizeof(IntAndCharStruct));
    printf("IntAndDoubleStruct: %d\n", sizeof(IntAndDoubleStruct));
    printf("IntFloatAndDoubleStruct: %d\n", sizeof(IntFloatAndDoubleStruct));
    getchar();
}
Run Code Online (Sandbox Code Playgroud)

它的输出是:

Int: 4
Float: 4
Char: 1
Double: 8
IntAndCharStruct: 8
IntAndDoubleStruct: 16 …
Run Code Online (Sandbox Code Playgroud)

c struct alignment

6
推荐指数
2
解决办法
616
查看次数